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

How do I enforce command line argument checking in 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。对于其他任何事情,它都应该引发异常。那可行吗?我怎么做?
谢谢。

它不漂亮,但它会阻止您使用除 -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,这很可能是我做过的最丑陋的参数验证,但我现在没有更好的想法。