匹配命令行参数 disable 或 enable only

match command line arguments disable or enable only

提问人:Darren 提问时间:11/10/2023 更新时间:11/10/2023 访问量:34

问:

不确定如何进行以下操作 - 脚本将只接受“启用”或“禁用”的命令行选项,任何其他选项都会导致显示帮助消息。

我在下面使用此代码,如果命令行参数与“启用”或“禁用”不匹配,我还想显示帮助消息。

if ([string]::IsNullOrEmpty($args)) {
    write-host "You must use either enable or disable as a command line argument.`n`n`te.g. .\""$(Split-Path -leaf $PSCommandpath)"" disable"
} else {
    Write-Host "$osName $bit (Build $buildNumber) Release ID $displayVersion"
}
powershell 命令行参数

评论


答:

1赞 mklement0 11/10/2023 #1

使脚本成为高级脚本,这样您不仅可以显式声明参数,还可以创建参数:

  • 命令的
  • 防止传递意外参数
  • 控制哪些参数是位置参数(即可以由不以参数名称开头的值绑定)

[ValidateSet()] 属性允许您将参数限制为一组给定的值:

[CmdletBinding()]
param(
  [ValidateSet('enable', 'disable')]
  [Parameter(Mandatory, Position=0)]
  $TargetState
)

"`$TargetState argument given: [$TargetState]"

注意:

  • Windows PowerShell 中,必须使用默认错误消息(有点冗长),如果两者都未传递或传递,则显示该错误消息。enableddisabled

  • PowerShell (Core) 7+ 中,可以将可选属性用于自定义错误消息;例如:ErrorMessage

    [ValidateSet('enable', 'disable', ErrorMessage = "'{0}' is not in set '{1}'")]
    
  • 强制参数意味着,如果调用时未给出任何值,PowerShell 会提示输入一个值

    • 如果你更愿意在这种情况下报告错误(鉴于这些提示的 UX 还有很多不足之处 - 请参阅 GitHub 问题 #4068),请使用带有子表达式的默认值 - 有关详细信息,请参阅此答案$(throw "...")
0赞 Darren 11/10/2023 #2
if (-not($args -in $("enable","disable"))) {
    write-host "You must use either enable or disable as a command line argument.`n`n`te.g. .\""$(Split-Path -leaf $PSCommandpath)"" disable"
} else {
    Write-Host "$osName $bit (Build $buildNumber) Release ID $displayVersion"
}

评论

0赞 Community 11/10/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 mklement0 11/11/2023
更好:。虽然你的答案在技术上是可行的,但最好使用 PowerShell 的参数声明,它提供了对所需行为的大量声明性控制,并与 PowerShell 的错误处理正确集成。$args -notin 'enable', 'disable'