PowerShell无法禁用对参数的明确前缀匹配的支持。
虽然有各种各样的权衡,但有几个选项。
选项1 - 自己解析参数:
function foo {
param()
# $args has all of the parameters and arguments
}
这是比较困难的给你写的,但解决您希望解决,因为你会完全自己的参数/参数结合的问题。
另一个缺点是参数没有制表符完成,至少在TabExpansion或TabExpansion2中没有一些额外的相应帮助(例如使用TabExpansion ++或PowerTab等模块)。
请注意,在此示例中,即使您的参数为“来自其余参数的值”,您也不希望cmdlet绑定,因为cmdlet绑定会添加常用参数,并且如果使用明确的前缀,那么这些参数将被绑定。
选项2 - 要求主叫做不同的事情
有几个用的cmdlet类似的问题,例如Invoke-Command或Get-Command。两者都接受一组参数。用户必须报价参数:
icm { param($a,$b) $b } -ArgumentList '-b','hello'
这些cmdlet使用-ArgumentList因为他们真的必须接受可能与小命令的参数冲突任意参数。
如果您的问题受到更多限制,可能还有其他选择,但它需要一些非常常用的语法,并且仍然存在某些参数问题。例如:
function foo
{
param([Parameter(ValueFromRemainingArguments=$true)]$ArgumentList)
$ArgumentList
}
foo -- -A 1 -Ar 2 -Arg 3
特殊标记' - '告诉PowerShell后面的所有内容都是参数。这样,看起来像参数的参数被视为参数。
如果调用者忘记' - ',这种方法可能会引起混淆。
嗯。取而代之的是''-b''是一个位置参数。我想这是不可避免的。 – bacar
除非你做了像Foo $ null'-b'baz -quux quuux – mjolinor
我看到有'[CmdletBinding(PositionalBinding = $ false)]'](http://stackoverflow.com/a/17043457/37941)但是我无法在PS 2.0中工作 – bacar