2012-02-07 8 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: 3 
One 
になるだろうと思った

Num Args: 0 

を得ました

何か不足していますか?

おかげ

答えて

7

あなたが実際にそこに2つのスコープを持っています。スクリプトレベルとスクリプトブロックレベル。 $args.Length$args[0]は、Invoke-Commandレベルで期待していることがあります。スクリプトブロック内には$argsの別のスコープがあります。スクリプトブロック内のコマンドラインから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になります。

このメソッドは、開発者として、必要なパラメータと、省略または省略可能なパラメータを決定できるようにするという利点があります。さらに、ユーザーは名前を付けられていてポジションではないので、好きな順序で引数を入力することができます。

位置パラメータとは対照的に名前付きパラメータを持つことの1つの欠点は、ユーザーが各パラメータ名を入力する必要があるため、コマンドライン呼び出しがかなり大きくなる可能性があることです。

関連する問題