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