2012-03-30 6 views

答えて

182

$ErrorActionPreference = "Stop"のようになります(つまり、これはコマンドレットに最適です)。

EXEの場合、EXE呼び出しごとに$LastExitCodeをチェックし、失敗したかどうかを判断する必要があります。残念ながら、Windowsでは、「成功」または「失敗」の終了コードを構成するものに関して、EXEがひどく一貫しているわけではないため、PowerShellがここで助けてくれるとは思えません。ほとんどの場合、成功を示すUNIX標準の0に従いますが、すべてではありません。 CheckLastExitCode function in this blog postをチェックしてください。それが役に立つかもしれません。

+2

'$ ErrorActionPreference =" Stop "は正常に動作するプログラム(正常に0を返します)で動作しますか? –

+10

いいえ、EXEではまったく動作しません。インプロセスで実行されるPowerShellコマンドレットでのみ機能します。それは一種の痛みですが、EXE呼び出しごとに$ LastExitCodeをチェックして、期待される終了コードとそれを確認し、そのテストが失敗を示していれば、スクリプトの実行を終了するためにスローする必要があります。 'throw" $ exeは終了コード$ LastExitCode "で失敗しました。ここで、$ exeはEXEへのパスです。 –

+2

外部プログラムと連携させる方法に関する情報が含まれているため、受け入れられました。 –

51

スクリプトの冒頭で文$ErrorActionPreference = "Stop"を使用してこれを達成できるはずです。

デフォルト設定の$ErrorActionPreferenceContinueです。このため、エラーが発生した後もスクリプトは継続して表示されます。

+12

これはプログラムには影響しません。コマンドレットのみです。 – Joey

4

悲しいことに、due to buggy cmdlets like New-RegKey and Clear-Disk、これらの回答はどれも十分ではありません。私は現在、私の正気を維持するために、PowerShellスクリプトの一番上にある次の行に定住しています。

Set-StrictMode -Version Latest 
$ErrorActionPreference = "Stop" 
$PSDefaultParameterValues['*:ErrorAction']='Stop' 

し、任意のネイティブ呼び出しはこの治療を取得します。

native_call.exe 
$native_call_success = $? 
if (-not $native_call_success) 
{ 
    throw 'error making native call' 
} 

ネイティブコールパターンがゆっくりと私はおそらくそれがより簡潔作るためのオプションを検討すべきであることを私のために十分に一般的になってきていること。私はまだパワーワードの初心者ですので、提案は大歓迎です。

1

私は同じことを探してここに来ました。 $ ErrorActionPreference = "Stop"はシェルを終了させる直前にエラーメッセージ(一時停止)を表示するとすぐにシェルを終了させます。私のバッチ感性に戻って落ちる:あなたはPowerShellの機能のためにとexeファイルの呼び出しに扱う若干異なる誤りが必要

Import-PSSession $Session 
If ($? -ne "True") {Pause; Exit} 
0

IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF 

は、私はこれはかなり私の特定のPS1のスクリプトで同じ動作することを発見しましたスクリプトの呼び出し元に失敗したことを伝える必要があります。 PsakeライブラリのExecの上に構築すると、以下の構造を持つスクリプトはすべてのエラーを止め、ほとんどのスクリプトの基本テンプレートとして使用できます。

Set-StrictMode -Version latest 
$ErrorActionPreference = "Stop" 


# Taken from psake https://github.com/psake/psake 
<# 
.SYNOPSIS 
    This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode 
    to see if an error occcured. If an error is detected then an exception is thrown. 
    This function allows you to run command-line programs without having to 
    explicitly check the $lastexitcode variable. 
.EXAMPLE 
    exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed" 
#> 
function Exec 
{ 
    [CmdletBinding()] 
    param(
     [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd, 
     [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ("Error executing command {0}" -f $cmd) 
    ) 
    & $cmd 
    if ($lastexitcode -ne 0) { 
     throw ("Exec: " + $errorMessage) 
    } 
} 

Try { 

    # Put all your stuff inside here! 

    # powershell functions called as normal and try..catch reports errors 
    New-Object System.Net.WebClient 

    # call exe's and check their exit code using Exec 
    Exec { setup.exe } 

} Catch { 
    # tell the caller it has all gone wrong 
    $host.SetShouldExit(-1) 
    throw 
} 
関連する問題