Quiero que mi script de PowerShell se detenga cuando falla cualquiera de los comandos que ejecuto (como set -e
en bash). Estoy usando ambos comandos de Powershell (New-Object System.Net.WebClient
) y programas (.\setup.exe
).Cómo detener una secuencia de comandos de PowerShell en el primer error?
Respuesta
$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.
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.
Esto no afecta a los programas, solo a los cmdlets. – Joey
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.
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}
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
}
- 1. cómo detener una secuencia de comandos en ejecución en Matlab
- 2. Ejecutar secuencia de comandos Powershell de Node.js
- 3. Cómo llamar a una función en otra secuencia de comandos de PowerShell al ejecutar la secuencia de comandos de PowerShell con 'Ejecutar con PowerShell'
- 4. ¿Cómo "detener" y "reanudar" la secuencia de comandos de Python?
- 5. Cómo iniciar PowerShell (no una secuencia de comandos) desde la línea de comandos
- 6. Invocar una segunda secuencia de comandos con argumentos de una secuencia de comandos
- 7. ¿Hay alguna forma de detener una secuencia de comandos pegada en el depurador de Chrome?
- 8. Error al manejar en una secuencia de comandos de Oracle
- 9. Invocar secuencia de comandos de PowerShell con argumentos de C#
- 10. ¿cómo detengo la ejecución en una secuencia de comandos python?
- 11. Detener IE cargar secuencia de comandos incluida dinámicamente dos veces
- 12. Cómo ejecución remota de una secuencia de comandos remota elevada en PowerShell
- 13. Cómo iniciar una secuencia de comandos en un punto especificado en Powershell
- 14. Error al redirigir stdout y stderr de la secuencia de comandos de powershell
- 15. Cómo detener la suspensión de una secuencia de comandos zsh (salida de tty)
- 16. Cómo detener IIS con PowerShell?
- 17. MSBuild en una secuencia de comandos Powershell - ¿Cómo puedo saber si la compilación tuvo éxito?
- 18. Ejecutar secuencia de comandos bash desde Windows PowerShell
- 19. PowerShell: ejecutar el bloque de secuencia de comandos en el ámbito específico
- 20. ¿Puede establecer DefaultDisplayPropertySet de un objeto en una secuencia de comandos de PowerShell v2?
- 21. ¿Cómo llamo a otra secuencia de comandos de PowerShell con una ruta relativa?
- 22. VS2010 - Cómo detener automáticamente la compilación en el primer error de compilación
- 23. salida un error de secuencia de comandos en
- 24. Error inexplicable en bash: el comando printf dentro de una secuencia de comandos devuelve "número inválido"
- 25. Hacer detener valgrind inmediatamente después del primer error
- 26. Stop en primer error
- 27. .net - ¿Cómo se registra una secuencia de comandos de inicio?
- 28. Cómo ejecutar una magia de IPython desde una secuencia de comandos (o cronometrar una secuencia de comandos de Python)
- 29. ¿Cómo se puede reiniciar automáticamente una secuencia de comandos python en caso de error?
- 30. secuencia de comandos PowerShell para comprobar una aplicación que está bloqueando un archivo?
¿Funciona '$ ErrorActionPreference =" Stop "' para programas de buen comportamiento (que devuelven 0 en caso de éxito)? –
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. –
Aceptado porque incluye información sobre cómo hacer que funcione con programas externos. –