2012-02-07 229 views
7

這裏是我的代碼:PowerShell中傳遞命令行參數

$script={ 
Write-Host "Num Args:" $args.Length; 
    Write-Host $args[0] 
} 

Invoke-Command -ScriptBlock $script 

當我運行

powershell.exe .\test.ps1 one two three 

Num Args: 0 

我想我會得到

Num Args: 3 
One 

我錯過了什麼?

感謝

回答

7

你實際上有兩個範圍存在。腳本級別和腳本塊級別。 $args.Length$args[0]將具有您在Invoke-Command級別期待的內容。在腳本塊內部還有另一個作用域$args。要從命令行獲得參數到腳本塊,您需要重新從Invoke-Command -ArgumentList $args傳遞它們。

4

您需要的參數傳遞給腳本塊:

Invoke-Command -ScriptBlock $script -ArgumentList $args 
0

您也可以顯式聲明命名參數。例如:

param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")

這可以讓你在命名參數傳遞給你的腳本,如下面的例子:

.\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"

,如果你省略-nameOfSomething "Slayer Roolz!",然後$nameOfSomething只會默認"some default sting"。同樣,除非另有定義,$someBoolSwitch默認爲$false

此方法的好處是允許您作爲開發人員來決定哪些參數是必需的,哪些參數可以省略或默認。此外,它允許用戶以任何他們喜歡的順序輸入參數,因爲它們被命名而不是位置。

命名參數與位置參數相反的一個缺點是命令行調用可能會變得相當大,因爲用戶必須鍵入每個參數名稱。