4

internal.ps1特定のパラメーターを受け入れるスクリプトがあります。

param ($paramA, $paramB)
Write-Host $PSBoundParameters

caller.ps1そして、それを呼び出すスクリプト:

.\internal -paramA A -paramB B

それはうまくいきます:

PS C:\temp> .\caller
[paramA, A] [paramB, B]    <<<< bounded to both params

ただし、呼び出し元では、パラメーターを var の内部に保持し、後で使用したいと考えています。ただし、それは機能しません。

$parms = "-paramA A -paramB B"
# Later...
.\internal $parms

Result: [paramA, A -paramB B]   <<<<< All got bounded to ParamA

配列を使用することもありません。

$parms = @("A", "B")
# Later...
.\internal $parms

Result: [paramA, System.Object[]]  <<<< Again, all bound to ParamA

どうすればこれを達成できますか? 実際のコマンドラインはより複雑で、長さが不明な場合があることに注意してください。

4

3 に答える 3

5

プラッティング演算子(@) は、必要なことを行う必要があります。最初にこの単純な関数を考えてみましょう:

function foo($a, $b) { "===> $a + $b" }

明示的な引数を指定して呼び出すと、期待どおりの結果が得られます。

foo "hello" "world"
===> hello + world

これら 2 つの値を配列に入れます。あなたが観察したように、通常の配列を渡すと、誤った結果が得られます。

$myParams = "hello", "world"
foo $myParams
===> hello world +

ただし、代わりに配列をスプラットすると、目的の結果が得られます。

foo @myParams
===> hello + world

これは、関数だけでなくスクリプトでも機能します。スクリプトに戻ると、結果は次のとおりです。

 .\internal @myParams
[paramA, hello] [paramB, world]

最後に、これは任意の数のパラメーターに対して機能するため、それらのアプリオリな知識が必要であることを知っておいてください。

于 2013-06-19T18:00:22.740 に答える
0

powershell -file c:\temp\test.ps1 @("A","B")

また

powershell -command "c:\temp\test.ps1" A,B

于 2013-06-19T11:13:34.527 に答える