Я хочу, чтобы мой скрипт PowerShell останавливался, когда любая из команд, которые я запускаю, не срабатывает (как set -e
в bash). Я использую обе команды Powershell ( New-Object System.Net.WebClient
) и программ ( .\setup.exe
).
источник
Я хочу, чтобы мой скрипт PowerShell останавливался, когда любая из команд, которые я запускаю, не срабатывает (как set -e
в bash). Я использую обе команды Powershell ( New-Object System.Net.WebClient
) и программ ( .\setup.exe
).
$ErrorActionPreference = "Stop"
поможет вам в этом (например, это прекрасно работает для командлетов).
Однако для EXE вы должны будете проверять $LastExitCode
себя после каждого вызова exe и определять, произошел ли сбой или нет. К сожалению, я не думаю, что PowerShell может помочь в этом, потому что в Windows EXE-файлы не очень согласуются с тем, что представляет собой код завершения «успех» или «отказ». Большинство из них следуют стандарту UNIX 0, что указывает на успех, но не все. Проверьте функцию CheckLastExitCode в этом сообщении в блоге . Вы можете найти это полезным.
$ErrorActionPreference = "Stop"
для хороших программ (которые возвращают 0 в случае успеха)?throw "$exe failed with exit code $LastExitCode"
где $ exe - просто путь к EXE.Вы должны быть в состоянии сделать это, используя оператор
$ErrorActionPreference = "Stop"
в начале ваших сценариев.Значение по умолчанию
$ErrorActionPreference
ISContinue
, поэтому вы видите ваши сценарии продолжает идти после возникновения ошибок.источник
К сожалению, из-за ошибочных командлетов, таких как New-RegKey и Clear-Disk , ни одного из этих ответов недостаточно. В настоящее время я остановился на следующих строках в верхней части любого сценария powershell, чтобы сохранить здравомыслие.
и тогда любой родной звонок получает это лечение:
Этот собственный шаблон вызовов постепенно становится достаточно распространенным для меня, поэтому я, вероятно, должен рассмотреть варианты, чтобы сделать его более кратким. Я все еще новичок в PowerShell, поэтому предложения приветствуются.
источник
Вам нужно немного по-другому обрабатывать ошибки для функций powershell и для вызова exe-файлов, и вы должны быть уверены, что сообщили вызывающему скрипту, что он потерпел неудачу. Построенный поверх
Exec
библиотеки Psake, скрипт со структурой ниже остановит все ошибки и будет использоваться в качестве базового шаблона для большинства скриптов.источник
Exec { sqlite3.exe -bail some.db "$SQL" }
, то-bail
вызывает ошибку , так как он пытается интерпретировать его в качестве параметра командлета? Упаковка вещей в кавычки, похоже, не работает. Любые идеи?Небольшая модификация ответа от @alastairtree:
Ключевые отличия здесь:
Invoke-Command
)-ErrorAction
поведение встроенных командлетовисточник
Invoke-Call { dotnet build $something }
& @ScriptBlock
и,& $ScriptBlock
кажется, делают то же самое. Не удалось гуглить, какая разница в этом случаеЯ новичок в powershell, но это кажется наиболее эффективным:
источник
Я пришел сюда в поисках того же. $ ErrorActionPreference = "Stop" немедленно убивает мою оболочку, когда я предпочитаю увидеть сообщение об ошибке (пауза) до его завершения. Возвращаясь к моей партии чувств:
Я обнаружил, что это работает примерно так же для моего конкретного сценария PS1:
источник
Перенаправление
stderr
в,stdout
кажется, также помогает без каких-либо других оболочек команд / скриптовых блоков, хотя я не могу найти объяснение, почему это работает так ...Это выведет следующее, как и ожидалось (команда
aws s3 ...
возвращает$LASTEXITCODE = 255
)источник