PowerShellスクリプトがあります。
...
Any-Command -ErrorCode Stop
...
次に、このスクリプトをバットスクリプトから呼び出します。
...
powershell myscript.ps1
...
呼び出されたPowerShellスクリプトがエラーで停止し、スクリプトの最後に達していない場合、 batスクリプトで知りたいと思います。どうやってするの?
PowerShellスクリプトがあります。
...
Any-Command -ErrorCode Stop
...
次に、このスクリプトをバットスクリプトから呼び出します。
...
powershell myscript.ps1
...
呼び出されたPowerShellスクリプトがエラーで停止し、スクリプトの最後に達していない場合、 batスクリプトで知りたいと思います。どうやってするの?
これを行う 1 つの方法は、次のようなトップ レベルのトラップ ステートメントをスクリプトに追加することです。
trap {
exit 1; # or whatever error code
}
注: トラップは時代遅れと見なされる場合があります (トップレベルでは好きですが)、もう 1 つのオプションは、スクリプト全体の try-finally です。
そのため、Any-Command が例外で終了すると、trap ステートメントが実行され、スクリプトはエラー コード 1 で終了します。これを追加しないと、Powershell はエラー コード 0 で終了します (結局のところ、Powershell は正常に実行されましたが、スクリプトはしませんでした)。
次に、次のようなものを使用して、bat スクリプトでエラー コードを検出できます。
powershell -noprofile -noninteractive -file <<your script>>
IF ERRORLEVEL 1 (echo ERROR) ELSE (echo OK)
pause
これにより、1 以上のエラー コードが検出されます。
も使用できます%ERRORLEVEL%
が、これは環境変数としてオーバーライドされる可能性があることに注意してください。
注: ネストされた実行空間でスクリプトを実行している場合は$host.SetShouldExit(1)
、ルート ホストも確実に終了するように使用することを検討できます。
マーカスからの回答に追加するだけです
トラップ コードが実際のエラーを隠していることに気付きました。私の場合、実際のエラーが発生する必要がありました。補完のために変更されたコードを追加するだけです。
trap
{
write-error $("Error: " + $_.Exception.Message);
exit 1; # or whatever error code
}
詳細については、http://huddledmasses.org/trap-exception-in-powershell/を参照してください。