web-dev-qa-db-ja.com

Powershellスクリプトで戻り値をキャッチする方法

他のPowershellスクリプトを実行するという戻り値を持つpowershellスクリプト(.ps1)があります。

このコマンドでスクリプトを呼び出します:

$result = Invoke-Expression -Command ".\check.ps1 $fileCommon"

Write-Output $result

出力は、他のスクリプトを持つWrite-Ouputのみであり、$trueまたは$falseである戻り値はありません。

他のスクリプトからの戻りをキャッチするにはどうすればよいですか?

7
gtx911

PowerShellのreturnステートメントの背後にある式は、他のすべての式と同様に評価されます。出力を生成する場合、stdoutに書き込まれます。 $ resultは、スクリプトによってstdoutに書き込まれたものを受け取ります。複数のものがstdoutに書き込まれている場合、これらのものを配列で取得します。

たとえば、check.ps1が次のようになっている場合:

Write-Output "$args[0]"
return $false

そしてあなたはそれを呼び出す

$result = &".\check.ps1" xxx

$resultは、値が「xxx」(文字列)および「False」(ブール)のサイズ2のオブジェクト配列になります。

戻り値のみをstdoutに書き込むようにスクリプトを変更できない場合(これが最もクリーンな方法です)、最後の値以外はすべて無視できます。

$result = &".\check.ps1" xxx | select -Last 1

$resultには、ブール値として「False」のみが含まれます。

スクリプトを変更できる場合、別のオプションは変数名を渡し、スクリプトでそれを設定することです。

コール:

&".\check.ps1" $fileCommon "result"
if ($result) {
    # Do things
}

スクリプト:

param($file,$parentvariable)
# Do things
Set-Variable -Name $parentvariable -Value $false -Scope 1

-Scope 1は親(呼び出し元)スコープを参照するため、呼び出し元のコードから読み取ることができます。

13
TToni