Quero que meu script do PowerShell seja interrompido quando qualquer um dos comandos executados falhar (como set -e
no bash). Estou usando os comandos do Powershell ( New-Object System.Net.WebClient
) e os programas ( .\setup.exe
).
fonte
Quero que meu script do PowerShell seja interrompido quando qualquer um dos comandos executados falhar (como set -e
no bash). Estou usando os comandos do Powershell ( New-Object System.Net.WebClient
) e os programas ( .\setup.exe
).
$ErrorActionPreference = "Stop"
você fará parte do caminho até lá (isto é, funciona muito bem para cmdlets).
No entanto, para EXEs, você precisará verificar a $LastExitCode
si mesmo após cada chamada de exe e determinar se isso falhou ou não. Infelizmente, acho que o PowerShell não pode ajudar aqui, porque no Windows, os EXEs não são terrivelmente consistentes com o que constitui um código de saída de "sucesso" ou "falha". A maioria segue o padrão UNIX de 0, indicando sucesso, mas nem todos o fazem. Confira a função CheckLastExitCode nesta postagem do blog . Você pode achar util.
$ErrorActionPreference = "Stop"
para programas bem comportados (que retornam 0 em caso de sucesso)?throw "$exe failed with exit code $LastExitCode"
onde $ exe é apenas o caminho para o EXE.Você deve conseguir isso usando a instrução
$ErrorActionPreference = "Stop"
no início de seus scripts.A configuração padrão de
$ErrorActionPreference
éContinue
, e é por isso que você vê seus scripts continuarem após a ocorrência de erros.fonte
Infelizmente, devido a cmdlets com erros como New-RegKey e Clear-Disk , nenhuma dessas respostas é suficiente. Atualmente, eu decidi as seguintes linhas no topo de qualquer script do PowerShell para manter minha sanidade.
e qualquer chamada nativa recebe este tratamento:
Esse padrão de chamada nativa está lentamente se tornando comum o suficiente para mim, para que eu provavelmente deva procurar opções para torná-lo mais conciso. Eu ainda sou um novato em PowerShell, então sugestões são bem-vindas.
fonte
Você precisa de um tratamento de erro um pouco diferente para as funções do PowerShell e para chamar exe, além de informar ao chamador do seu script que ele falhou. Construindo sobre
Exec
a biblioteca Psake, um script que tem a estrutura abaixo irá parar com todos os erros e é utilizável como modelo base para a maioria dos scripts.fonte
Exec { sqlite3.exe -bail some.db "$SQL" }
a-bail
causa um erro, uma vez que está tentando interpretá-lo como um parâmetro Cmdlet? O agrupamento de aspas não parece funcionar. Alguma ideia?Uma pequena modificação na resposta de @alastairtree:
As principais diferenças aqui são:
Invoke-Command
)-ErrorAction
comportamento dos cmdlets internosfonte
Invoke-Call { dotnet build $something }
& @ScriptBlock
e& $ScriptBlock
parece fazer a mesma coisa. Não têm sido capazes de google qual é a diferença neste casoEu sou novo no PowerShell, mas isso parece ser mais eficaz:
fonte
Eu vim aqui procurando a mesma coisa. $ ErrorActionPreference = "Stop" mata meu shell imediatamente quando eu preferir ver a mensagem de erro (pausa) antes de terminar. Recorrendo às minhas sensibilidades de lote:
Descobri que isso funciona da mesma forma para o meu script ps1 específico:
fonte
Redirecionar
stderr
parastdout
parece também fazer o truque sem quaisquer outros comandos / wrappers de scriptblock, embora eu não consiga encontrar uma explicação por que funciona dessa maneira.Isso produzirá o seguinte conforme o esperado (o comando
aws s3 ...
retorna$LASTEXITCODE = 255
)fonte