在powershell中使用别名的空参数

时间:2012-09-17 17:42:27

标签: powershell alias

我希望-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}}

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的文档。