0

別のスクリプトで名前付きパラメーターに配列を渡す方法を見つけようとしています。しかし、私は解決策を見つけることができませんでした。

Test2.ps1:

param(
    [int]$a,
    [int]$b,
    [int]$c,
    [string[]]$d
)

write-host "`$a = $a"
write-host "`$b = $b"
write-host "`$c = $c"
write-host "`$d:" -nonewline
foreach($str in $d) {
    write-host " $str" -nonewline
}
write-host

メインスクリプト:

$arr = @("abc", "def", "ghi")
$params = @{
    a = 1;
    b = 2;
    c = 3;
    d = $arr
}

#invoke-command -filepath "test2.ps1" -ArgumentList 1,2,3,@("abc", "def", "ghi")
$scriptPath = "test2.ps1"
$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")
invoke-command -scriptblock $sb

実行すると、出力が得られました

$d:System.Object[]

以下の行は、別の Stackoverflow の回答からコピーされたものですが、最初の 3 つの名前付きパラメーターに対してどのように機能したかはよくわかりません。

$sb = [scriptblock]::create(".{$(get-content $ScriptPath -Raw)} $(&{$args} @params)")

特に「$(&{$args} @params)」の部分。私はスプラッティングの基本的な理解を持っていますが、これは私を超えています. 誰かが私のために構文を少し説明していただければ幸いです。

4

1 に答える 1

1

展開可能な文字列の中に入れる@paramsと、パーサーが結果の出力を文字列に変換するように強制されます。デフォルトの動作ToString()(オーバーライドされていない場合) は、問題のオブジェクトの型名を返すだけです。

パラメータを指定する前に、スクリプトを呼び出すまで待ち​​ます。

$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& $sb $args @params

または、特定のパラメーターを使用してスクリプトをドット ソース化する場合は、次のようにします。

$sb = [scriptblock]::Create("$(get-content $ScriptPath -Raw)")
& {.$sb $args @params}
于 2015-10-19T13:11:43.127 に答える