2012-03-30 16 views

Respuesta

182

$ErrorActionPreference = "Stop" te llevarán a una parte del camino (es decir, esto funciona muy bien para cmdlets).

Sin embargo, para EXEs, necesitará comprobar $LastExitCode usted mismo después de cada invocación de exe y determinar si eso falló o no. Lamentablemente, no creo que PowerShell pueda ayudar aquí porque en Windows, los EXE no son muy consistentes en lo que constituye un código de salida de "éxito" o "error". La mayoría sigue el estándar UNIX de 0 indicando éxito, pero no todos lo hacen. Consulte el CheckLastExitCode function in this blog post. Tu podrias encontrar esto útil.

+2

¿Funciona '$ ErrorActionPreference =" Stop "' para programas de buen comportamiento (que devuelven 0 en caso de éxito)? –

+10

No, no funciona para EXEs. Solo funciona para los cmdlets de PowerShell que se ejecutan en proceso. Es un poco molesto, pero debe verificar $ LastExitCode después de cada invocación de EXE, compruebe que contra el código de salida esperado y si esa prueba indica falla, debe tirar para finalizar la ejecución del script, p. 'throw '$ exe failed con el código de salida $ LastExitCode" 'donde $ exe es solo la ruta al EXE. –

+2

Aceptado porque incluye información sobre cómo hacer que funcione con programas externos. –

51

Debería poder lograr esto utilizando la instrucción $ErrorActionPreference = "Stop" al comienzo de sus scripts.

La configuración predeterminada de $ErrorActionPreference es Continue, por lo que está viendo que sus scripts continúan después de que se producen errores.

+12

Esto no afecta a los programas, solo a los cmdlets. – Joey

4

Lamentablemente, due to buggy cmdlets like New-RegKey and Clear-Disk, ninguna de estas respuestas es suficiente. Actualmente me he decidido por las siguientes líneas en la parte superior de cualquier script de powershell para mantener mi cordura.

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

y luego cualquier llamada nativa obtiene este tratamiento:

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

Ese patrón de llamada nativa está convirtiendo lentamente en común suficiente para mí que probablemente debería mirar en las opciones para hacer que sea más concisa. Todavía soy un novato de powershell, así que las sugerencias son bienvenidas.

1

Vine aquí buscando lo mismo. $ ErrorActionPreference = "Parar" mata mi caparazón inmediatamente cuando prefiero ver el mensaje de error (pausa) antes de que finalice. Volver a caer en mis sensibilidades de lote:

IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF 

He encontrado que esto funciona más o menos la misma para mi en particular guión PS1:

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

Es necesario un manejo ligeramente diferente para las funciones de PowerShell y para llamar exe error, y debe asegurarse de decirle a la persona que llama de su secuencia de comandos que ha fallado. Sobre la base de Exec de la biblioteca Psake, una secuencia de comandos que tiene la estructura siguiente se detendrá en todos los errores y se puede utilizar como una plantilla base para la mayoría de las secuencias de comandos.

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 
} 
Cuestiones relacionadas