如何在PowerShell中强制执行命令行参数检查

时间:2015-01-06 02:09:25

标签: powershell

这是我的脚本(test.ps1):

[CmdLetBinding()]

Param
(
    [parameter(Mandatory=$true)][string]$environment,
    [switch][bool]$continue=$true
)

Write-Host $environment
Write-Host $continue

问题:
如果我通过给出一个参数来调用这个脚本,该参数是我在脚本中指定的参数的子字符串,如下所示:PS> 。\ test.ps1 -envi:blah,PowerShell似乎没有检查参数名称。我希望PowerShell强制执行参数拼写,即它应该只接受与脚本中的参数名称匹配的-environment。除此之外,它应该引发异常。那可行吗?我怎么做?
感谢。

1 个答案:

答案 0 :(得分:1)

它并不漂亮,但它会阻止您使用除-environment之外的任何内容作为参数名称。

Param
(
    [parameter(Mandatory=$true)][string]$environment,
    [parameter()]
     [ValidateScript({throw "Invalid parameter. 'environment' required."})]
     [string]$environmen,
    [switch][bool]$continue=$true
)


Write-Host $environment
Write-Host $continue
}

编辑:正如Matt在评论中指出的那样,自动消除歧义将强制您指定足够的参数名称以查找唯一的子字符串匹配。我在这里做的基本上是给它一个参数来满足除最后一个字符以外的所有字符以防止使用任何子字符串直到最后一个字符(因为它不明确),并抛出一个错误以防止你使用它。

而且,FWIW,这可能是我做过的最丑陋的参数验证,但我现在没有任何更好的想法。