В аналогичном сценарии я использую исключения (throw) и другие виды завершающих ошибок: в этом случае код выхода PowerShell равен 1. Если сценарий завершает сам себя (даже при отсутствии ошибок завершения), тогда код выхода PowerShell равен 0, нам не нужно вызывать exit 0
. Если нам нужно что-то кроме 0 и 1, тогда мы действительно должны использовать exit
или SetShouldExit
(но см. Примечания ниже).
Давайте посмотрим на сценарии.
test1.ps1
'before2'
.\test2
'after2'
'before3'
.\test3
'after3'
'before4'
.\test4
'after4'
test2.ps1
'inner before 2'
exit 2
'inner after 2'
test3.ps1
'inner before 3'
$host.SetShouldExit(3)
'inner after 3'
test4.ps1
throw 'Oops'
Вывод test1.ps1:
before2
inner before 2
after2
before3
inner before 3
inner after 3
after3
before4
Oops
At ...
+ throw <<<< 'Oops'
В этом тестовом сценарии тип test4.ps1 работает, а test2.ps1 и test3.ps1 не работают (если работать означает сбой и немедленное завершение сеанса).
Вывод показывает, что exit
завершает текущий скрипт, а SetShouldExit
- нет.
Код выхода powershell.exe .\test1
равен 3 из-за $host.SetShouldExit(3)
. Я попытался отключить эту строку, чтобы проверить, делает ли exit 2
код выхода равным 2. Нет, это не так, код выхода равен 1 из-за ошибки в test4.
Я заметил еще одно отличие. Если я вызываю скрипт из интерактивной консоли PowerShell, то $host.SetShouldExit
в скрипте заставляет консоль закрываться после вызова. exit
нет.
Мысль. Поведение $host.SetShouldExit
может зависеть от реализации хоста. Например, на одном моем собственном хосте выход вообще не поддерживается (не разрешено закрывать хост-приложение просто так), и моя реализация SetShouldExit
в основном ничего не делает.