我希望-h
在没有传递值的情况下使用-h
以及参数:Param(
$BadParam,
[alias("h")][String]$Help,
[alias("s")][String]$Server,
[alias("d")][String]$DocRoot,
[alias("c")][String]$Commit,
[alias("b")][String]$Branch
)
但是,我希望其他人保持原样......也就是说,它们是可选的,除非您使用参数别名并且需要提供值。
if(!$Help)
{
Write-Host "Here's the menu for how it works bro."
}
if($Help)
{
Write-Host "Here's more info on that particular thing from the menu."
}
例如(缺乏更好):
-> script.ps1 -s test -h
-> Here's the menu for how it works bro.
-> script.ps1 -s test -h server
-> Here's more info on that particular thing from the menu.
-> script.ps1 -s -h server
-> You are missing a value for -e.
我期望它在shell中表现如何:
{{1}}
答案 0 :(得分:3)
Powershell并不真正支持这样的事情。您可以使用[switch]
参数来指定没有值,或者您可以使用[string]
参数,该参数必须完全不存在,或者提供值。您不能拥有一个支持缺席的参数,没有指定值,并且使用值指定。
另一种选择是将其设为[string]
,但让用户通过$null
,但这种情况很糟糕。
另一个非常hacky的替代方案是使用参数位置做一些诡计。 -Help
可以是[switch]
,然后可能会有另一个参数-ThingHelp
位于[string]
之后。然后,看起来像-Help 'foo'
的调用没有将$Help
设置为'foo'
,而是设置$Help
开关,并分配$ThingHelp = 'foo'
。
function ParamTest
{
param(
[Parameter(Position = 0)]
[switch]$Help,
[Parameter(Position = 1)]
[string] $ThingHelp
)
"Help is [$help]"
"ThingHelp is [$thingHelp]"
}
这支持以下内容:
PS> ParamTest # $help = $false, $thingHelp = null
PS> ParamTest -Help # $help = $true, $thingHelp = null
PS> ParamTest -Help 'foo' # $help = $true, $thingHelp = 'foo'
像这样的黑客一般都是不一个好主意,因为它们往往既脆弱又容易混淆。您应该能够向普通的PowerShell用户提供脚本,他们应该立即了解参数的含义和用法。如果你必须解释一堆自定义的东西,其中没有成千上万的其他cmdlet,你可能会浪费每个人的时间。
如果你真的在实施某种帮助/使用系统,请停止! Powershell免费提供全面的帮助系统。您可以记录每个参数,提供示例代码等,而无需任何额外的操作。请参阅comment-based help的文档。