13

-Fileコマンド ライン スイッチを使用して (2.0 で) Powershell スクリプトを実行し、Param で入力パラメーターを明示的に定義すると、定義済みまたは予想されるエラー コードが適切に返される代わりに、終了コードが常に "0" (決して失敗しない) になります。これは、明示的なパラメーター定義と-Command
スイッチ を使用する場合には発生しませんが、無関係な目的のために、スクリプトに -File スイッチを保持する必要があります。

回避策(明示的なパラメーター定義の削除を伴わないもの) に関する支援は、非常に役立ちます。

Powershell は「正しい終了コードを返すことができません」:

exit1.ps1: パラメータを明示的に定義するスクリプトを呼び出します。エラーレベルは、たとえスクリプトの一部が不用意に失敗したとしても、常に 0 です。

param(
    [Parameter(mandatory=$true)][string]$arg1,
    [Parameter(mandatory=$true)][string]$arg2,
    [Parameter(mandatory=$true)][string]$arg3
);
exit 1;

出力:

C:\temp\testnant>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\exit1.ps1 "one" "two" "three"

C:\temp\testnant>echo %errorlevel%
0




次に、param 関数を変更して明示的でないようにするときに、同じことを試してみましょう。

Exit1LooseParam.ps1:

param(
    $arg1,
    $arg2,
    $arg3
);
exit 1;

出力 (3 つのパラメーターを使用):

C:\temp\testnant>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\Exit1looseParam.ps1 "one" "two" "three"

C:\temp\testnant>echo %errorlevel%
1




入力パラメーターを明示的に定義すると、Powershell は何らかの理由で「気が狂った」ように見え、適切な終了コードを返すことができないようです。

誰かが回避策を持っているか、これが起こっている理由を説明できますか?

4

1 に答える 1

15

うーん、それは奇妙です、私exit 1は両方の場合でうまくいくと思います。少なくとも、これを両方に使用できます。

[Environment]::Exit(1)

于 2012-01-17T21:59:54.397 に答える