PowerShell 无法禁用对参数明确前缀匹配的支持。
虽然有各种权衡,但仍有一些选择。
选项 1 - 自己解析参数:
function foo {
param()
# $args has all of the parameters and arguments
}
这对你来说比较难写,但解决了你希望解决的问题,因为你将完全拥有参数/参数绑定。
另一个缺点是参数没有制表符完成,至少在 TabExpansion 或 TabExpansion2 中没有一些额外的相应帮助(例如,使用 TabExpansion++ 或 PowerTab 之类的模块)。
请注意,在此示例中,即使您有一个“来自剩余参数的值”的参数,您也不希望绑定 cmdlet,因为 cmdlet 绑定将添加公共参数,并且如果使用明确的前缀,这些参数将被绑定。
选项 2 - 要求调用者做一些不同的事情
有几个 cmdlet 存在类似问题,例如调用命令或获取命令。两者都接受一系列参数。用户必须引用参数:
icm { param($a,$b) $b } -ArgumentList '-b','hello'
这些 cmdlet 使用 -ArgumentList 是因为它们确实必须接受可能与 cmdlet 的参数冲突的任意参数。
如果您的问题受到更多限制,可能还有另一种选择,但它需要一些不常用的语法,并且某些参数仍然存在问题。一个例子:
function foo
{
param([Parameter(ValueFromRemainingArguments=$true)]$ArgumentList)
$ArgumentList
}
foo -- -A 1 -Ar 2 -Arg 3
特殊标记“--”告诉 PowerShell 后面的所有内容都是一个参数。这样,看起来像参数的参数被视为参数。
如果调用者忘记了“--”,这种方法可能会令人困惑。