2013-10-24 20 views
6

EDIT:このコードは、この問題が発生している完全な実装ではなく、簡単なテストケースに変更されています。PowerShellスクリプトの引数が配列として渡される

Powershellスクリプトを別のスクリプトから呼び出そうとしていますが、私が期待しているように機能していません。私が物事を理解すると、 "&"演算子は配列を別個のパラメータに展開することになっています。それは私のために起こっていない。私はPROBと思い

Parameter one: a b c 
Parameter two: 
Parameter three: 

:以下の出力で.\caller.ps1結果を実行

caller.ps1

$scriptfile = ".\callee.ps1" 
$scriptargs = @(
    "a", 
    "b", 
    "c" 
) 

& $scriptfile $scriptargs 

callee.ps1

Param (
    [string]$one, 
    [string]$two, 
    [string]$three 
) 

"Parameter one: $one" 
"Parameter two: $two" 
"Parameter three: $three" 

私が経験しているのは、$scriptargs配列が展開されておらず、むしろパラメータとして渡されています。 PowerShell 2を使用しています。

caller.ps1に引数の配列でcallee.ps1を実行させるにはどうすればよいですか?

+0

PowerShell Community ExtensionsのEchoArgsユーティリティを使用しており、引数の形式が正しく表示されていることにも注意してください。 – Sam

+0

配列として展開argsを定義しました。文字列を式として呼び出そうとしています – rerun

+0

[this blog post](http://edgylogic.com/blog/powershell- 「外部スクリプトを実行してスクリプトに渡す引数を作成したいのですが? – Sam

答えて

9

ネイティブコマンドを起動すると、& $program $programargsのような呼び出しが正しくので、引数の配列をエスケープします実行可能ファイルによって正しく解析されていることを確認します。ただし、PowerShellコマンドレット、スクリプト、または関数の場合、シリアライズ/解析往復を必要とする外部プログラミングはないため、配列はそのままの状態で渡されます。

代わりに、スクリプトに配列(またはハッシュテーブル)の要素を渡すsplattingを使用することができる:& $scriptfile @scriptargs

& $scriptfile @scriptargs 

@$scriptargsの値がのパラメータに適用させるにスクリプト。

+0

ああ..スプラットありがとう。 – sonjz

+2

スプラット処理にはPowerShell 3.0以降が必要です。 – Sam

+1

@Sam:MSは少なくとも2.0と言う - > https://technet.microsoft.com/en-us/library/jj672955.aspx – Sebastian

1

変数を1つのオブジェクトとして渡しているので、それらを個別に渡す必要はありません。

これは、ここに動作します:

$scriptfile = ".\callee.ps1" 
& $scriptfile a b c 

がそうするこの:

$scriptfile = ".\callee.ps1" 
$scriptargs = @(
    "a", 
    "b", 
    "c" 
) 

& $scriptfile $scriptargs[0] $scriptargs[1] $scriptargs[2] 

あなたは配列のように、単一のオブジェクトとしてそれを渡す必要がある場合は、呼び出し先のスクリプトがそれを分割することができます;その特定のコードは、渡すデータのタイプによって異なります。

1

使用起動-Expressionコマンドレット:

Invoke-Expression ".\callee.ps1 $scriptargs" 

その結果、あなたが得るだろう:

PS > Invoke-Expression ".\callee.ps1 $scriptargs" 
Parameter one: a 
Parameter two: b 
Parameter three: c 
PS > 
+0

デザイン時に議論が何であるか(あるいはそこにどれくらいあるか)を知る必要はないという利点があります。 – Sam

+3

Invoke-Expressionには、引用符で囲まれた引数を含む多くの苦しいエラーがあります。また、(入力を慎重にチェックしないと)セキュリティホールになる可能性があります。 –

+0

私は間違いなくこれ以上Emperor XLIIsソリューションを好むだろう。 – mzedeler