13

Powershellをフラグ付きのBashのように動作させるにはどうすればよいset -eですか?set -o errexit「単純なコマンドがゼロ以外のステータスで終了した場合はすぐに終了する」というBashスクリプトを作成します。

設定すればできると思いまし$ErrorActionPreference="Stop"たが、うまくいかないようです。スクリプトがあるとしますa.ps1

$ErrorActionPreference="Stop"
& cmd /c "exit 1"
echo "cmd exited `$LastExitCode=$LastExitCode and `$?=$?"

私がそれを実行した場合

.\a. ; echo "a.ps1 exited `$LastExitCode=$LastExitCode `$?=$?"

驚いたことに、それは印刷されます

cmd exited $LastExitCode=1 and $?=False
a.ps1 exited $LastExitCode=1 $?=True

どうしたの?!私はa.ps1が最初の行の後に終了し、エラーをスローして$を設定することを期待していましたか?Falseに。

$ ErrorActionPreferenceを説明する公式ドキュメントはありますか?私が見つけたのは、コーヒーに関するブログのこの投稿だけでした。

4

1 に答える 1

12

$ErrorActionPreference意図したとおりに機能しますが、ネイティブプログラムの終了コードがPowerShellコマンドレットほど適切に動作しないというだけです。

エラーの場合cmdlet、エラー状態を判断するのはかなり簡単です。例外が発生したかどうか。したがって、以下は次のように設定されたWrite-Hostステートメントに到達しません。$ErrorActionPreferenceStop

Write-Error blah

また

Get-ChildItem somepathwhichsurelydoesntexisthere

ネイティブプログラムの場合、ゼロ以外の終了コードがエラーを通知するのと同様に、ゼロの終了コードは通常、エラーが発生しなかったことを通知しますが、これは単なる慣例です。choice終了コードが1の場合、エラーであると思いますか?

これを処理する唯一の堅牢な方法は、ネイティブコマンドを実行し、必要に応じて自分で処理した後、終了コードを確認することです。この場合、規則はデフォルトの動作を保証するほど強力ではないため、PowerShellは結果が何を意味するのかを推測しようとはしません。

生活を楽にしたい場合は、関数を使用できます。

function Invoke-NativeCommand {
  $command = $args[0]
  $arguments = $args[1..($args.Length)]
  & $command @arguments
  if ($LastExitCode -ne 0) {
    Write-Error "Exit code $LastExitCode while running $command $arguments"
  }
}

しかし、一般的に、多くのプログラムは、前述の規則に準拠していないため、異なる処理が必要です。

于 2012-07-12T11:28:32.950 に答える