То, что вы запрашиваете, аналогично опции set -e
в bash
, которая заставляет скрипт мгновенно завершать работу в случае сбоя команды (кроме условных) [1] .
PowerShell не имеет такой опции [2] , но вы можете эмулировать ее:
# Set up a trap (handler for when terminating errors occur).
Trap {
# Print the error.
# IMPORTANT: -ErrorAction Continue must be used, because Write-Error
# itself would otherwise cause a terminating error too.
Write-Error $_ -ErrorAction Continue
exit 1
}
# Make non-terminating errors terminating.
$ErrorActionPreference = 'Stop'
# Based on $ErrorActionPreference = 'Stop', any error reported by
# Copy-Item will now cause a terminating error that triggers the Trap
# handler.
Copy-Item xxx1 yyy1 -Force
Copy-Item xxx2 yyy2 -Force
Copy-Item xxx3 yyy3 -Force
Copy-Item xxx4 yyy4 -Force
# Handle failure of an external program.
foo.exe -bar
if ($LASTEXITCODE -ne 0) { Throw "foo failed." } # Trigger the trap.
# Signal success.
exit 0
Примечание
Внутри PowerShell, коды выхода не используются при обработке ошибок; они обычно вступают в игру только при вызове внешних программ из PowerShell или когда PowerShell / сценарию PowerShell необходимо сигнализировать об успехе или сбое во внешнем мире (при вызове из другой оболочки, например, cmd
в Windows или bash
на Unix-подобных платформах).
Автоматическая переменная $LASTEXITCODE
PowerShell отражает код завершения самой последней исполняемой внешней программы / скрипта PowerShell, который вызывается exit <n>
.
Вызовы внешним (консольным / терминальным) программам, которые сигнализируют об ошибке через ненулевой код выхода, , а не запускают блок trap
, отсюда явный оператор throw
в приведенном выше фрагменте кода.
- Если вы не установили код выхода явно, то код завершения любой внешней программы, которая выполнялась последней, определяет общий код завершения скрипта.
[1] Обратите внимание, что у этого параметра есть свои критические замечания, потому что точные правила, когда допускается сбой и когда он вызывает отмену скрипта, трудно запомнить - см. http://mywiki.wooledge.org/BashFAQ/105
[2] Потенциальное добавление поддержки для него обсуждается в этом выпуске GitHub .