2012-09-17 34 views
0

我希望-h不需要传递值就可以工作,-h也可以带参数: 但是,我希望其他人保持它们的样子......也就是说,它们是可选的,除非你别名参数,并且你需要提供一个值。在powershell中使用别名的空参数

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. 

回答

3

PowerShell不会真正支持这样的事情。您可以有一个[switch]参数,该参数可以指定为无值,或者您可以具有参数[string],该参数必须完全缺失或提供值。你不能有一个参数支持不存在,没有值指定,并指定一个值。

一种替代方法是使其成为[string],但用户通过$null,但这种吸引。

另一个非常冒险的选择是做一些与参数位置欺骗。 -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