2014-02-12 58 views
0

鑑於這種功能和調用:我可以抑制參數別名嗎?

function Foo($bar) { 
    Write-Host "bar=$bar, other args = $args" 
} 

Foo -b baz -quux quuux 

PowerShell的將視-b參數作爲別名$bar參數和打印

bar=baz, other args = -quux quuux 

我不希望它這樣做!我的函數需要使用命名參數和任意附加參數;如果其中一個任意參數是-b,我不希望它分配到$bar。也就是我希望它能夠打印:

bar=, other args = -b baz -quux quuux 

我可以抑制PowerShell的默認參數別名嗎?

我使用PowerShell 2.0

回答

2

您可以通過引用它解釋-b作爲參數別名停止解析器:

function Foo($bar) { 
    Write-Host "bar=$bar, other args = $args" 
} 

Foo '-b' baz -quux quuux 

bar=-b, other args = baz -quux quuux 
+0

嗯。取而代之的是''-b''是一個位置參數。我想這是不可避免的。 – bacar

+0

除非你做了像Foo $ null'-b'baz -quux quuux – mjolinor

+0

我看到有'[CmdletBinding(PositionalBinding = $ false)]'](http://stackoverflow.com/a/17043457/37941)但是我無法在PS 2.0中工作 – bacar

2

AFAIK,你不能兩者兼得。您可以使用展示您在此處看到的行爲的「基本」功能,也可以使用帶有命名參數的高級功能,這些參數將嚴格驗證參數名稱。

「任意參數」真的很難看,恕我直言,應該避免一些原因(其中一些涉及代碼安全性 - 您最終可能會執行未知的任意代碼?)。

使Foo爲高級函數,並使您的「任意」參數爲可選的Objects的集合。

function Foo { 
[cmdletBinding()] 
param (
    [Parameter(Mandatory=$True)] 
    [string]$bar, 
    [Parameter(Mandatory=$False)] 
    [object[]]$args 
) 
    Write-Output "bar=$bar"; 
    # Test for $args here and process each item in it 

} 
+0

Re「你可以使用帶有命名參數的高級函數,它將嚴格驗證參數名稱」 - 這是否意味着只接受確切的名稱?如果是這樣,怎麼樣?在你的例子中運行'Foo -b abc'會打印'bar = abc',所以我沒有看到那些參數名已經被嚴格驗證。 (PS 2.0) – bacar

+1

這真的很奇怪,我確信我的第一次運行已經拒絕了'-b',但是我從此關閉了窗口,現在無法再現它。 – alroc

+0

驗證非任意參數/參數要容易得多,因爲您在設計函數時知道您的輸入應該是什麼樣子。通過PowerShell高級函數提供的內置驗證,您可以設計驗證要比在函數體中編寫額外的邏輯容易得多。這是從原來的問題變得非常關鍵。 – alroc

2

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後面的所有內容都是參數。這樣,看起來像參數的參數被視爲參數。

如果調用者忘記' - ',這種方法可能會引起混淆。

相關問題