Quiero que mi script de PowerShell se detenga cuando alguno de los comandos que ejecuto falla (como set -e
en bash). Estoy usando los comandos de Powershell ( New-Object System.Net.WebClient
) y los programas ( .\setup.exe
).
fuente
Quiero que mi script de PowerShell se detenga cuando alguno de los comandos que ejecuto falla (como set -e
en bash). Estoy usando los comandos de Powershell ( New-Object System.Net.WebClient
) y los programas ( .\setup.exe
).
$ErrorActionPreference = "Stop"
te llevará a una parte del camino (es decir, esto funciona muy bien para cmdlets).
Sin embargo, para los EXE, tendrá que comprobarse $LastExitCode
después de cada invocación de exe y determinar si eso falló o no. Desafortunadamente, no creo que PowerShell pueda ayudar aquí porque en Windows, los EXE no son terriblemente consistentes en lo que constituye un código de salida de "éxito" o "fracaso". La mayoría sigue el estándar UNIX de 0 que indica éxito, pero no todos lo hacen. Echa un vistazo a la función CheckLastExitCode en esta publicación de blog . Tu podrias encontrar esto útil.
$ErrorActionPreference = "Stop"
Funciona para programas con buen comportamiento (que devuelven 0 en caso de éxito)?throw "$exe failed with exit code $LastExitCode"
donde $ exe es solo la ruta a El EXE.Debería poder lograr esto utilizando la declaración
$ErrorActionPreference = "Stop"
al comienzo de sus scripts.La configuración predeterminada de
$ErrorActionPreference
esContinue
, por lo que está viendo que sus scripts continúan después de que ocurran los errores.fuente
Lamentablemente, debido a errores de cmdlets como New-RegKey y 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.
y luego cualquier llamada nativa recibe este tratamiento:
Ese patrón de llamadas nativas se está volviendo lo suficientemente común para mí que probablemente debería buscar opciones para hacerlo más conciso. Todavía soy un novato de PowerShell, así que las sugerencias son bienvenidas.
fuente
Necesita un manejo de errores ligeramente diferente para las funciones de PowerShell y para llamar a los exe, y debe asegurarse de informarle al llamador de su script que ha fallado. Sobre la base de
Exec
la biblioteca Psake, un script que tiene la estructura a continuación se detendrá en todos los errores, y se puede usar como plantilla base para la mayoría de los scripts.fuente
Exec { sqlite3.exe -bail some.db "$SQL" }
la-bail
provoca un error, ya que está tratando de interpretarlo como un parámetro de cmdlet? Envolver cosas entre comillas no parece funcionar. ¿Algunas ideas?Una ligera modificación a la respuesta de @alastairtree:
Las diferencias clave aquí son:
Invoke-Command
)-ErrorAction
comportamiento de los cmdlets integradosfuente
Invoke-Call { dotnet build $something }
& @ScriptBlock
y& $ScriptBlock
parecen hacer lo mismo. No he podidoSoy nuevo en PowerShell, pero esto parece ser más efectivo:
fuente
Vine aquí buscando lo mismo. $ ErrorActionPreference = "Stop" mata mi shell inmediatamente cuando prefiero ver el mensaje de error (pausa) antes de que termine. Recurriendo a mis sensibilidades de lote:
Descubrí que esto funciona más o menos igual para mi script ps1 particular:
fuente
Redirigir
stderr
astdout
parece que también funciona sin ningún otro comando / envoltorio de bloque de script, aunque no puedo encontrar una explicación de por qué funciona de esa manera ...Esto generará lo siguiente como se esperaba (el comando
aws s3 ...
regresa$LASTEXITCODE = 255
)fuente