Я искал способ завершить сценарий PowerShell (PS1), когда в функции возникает неисправимая ошибка. Например:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
Конечно, нет такой вещи как $host.Exit()
. Есть $host.SetShouldExit()
, но это на самом деле закрывает окно консоли, а это не то, что я хочу. То, что мне нужно, это что-то эквивалентное Python, sys.exit()
которое просто остановит выполнение текущего скрипта без дополнительной информации.
Редактировать: Да, это просто exit
. Duh.
powershell
kprobst
источник
источник
Ответы:
Вы должны использовать в
exit
ключевое слово .источник
Я понимаю, что это старая запись, но я часто возвращаюсь к этой теме, так как это один из лучших результатов поиска при поиске по этой теме. Однако я всегда оставляю более смущенным, чем когда приходил из-за противоречивой информации. В конечном счете, я всегда должен выполнять свои собственные тесты, чтобы понять это. Так что на этот раз я опубликую свои выводы.
TL; DR Большинство людей захотят использовать
Exit
для завершения запущенных скриптов. Однако, если ваш скрипт просто объявляет функции, которые впоследствии будут использоваться в оболочке, вы захотите использовать ихReturn
в определениях указанных функций.Выход против возврата против перерыва
Выход: это «выйдет» из текущего запущенного контекста. Если вы вызываете эту команду из скрипта, он выйдет из скрипта. Если вы вызовете эту команду из оболочки, она выйдет из оболочки.
Если функция вызывает команду Exit, она выходит из любого контекста, в котором она выполняется. Поэтому, если эта функция вызывается только из запущенного сценария, она завершает этот сценарий. Однако, если ваш скрипт просто объявляет функцию, чтобы ее можно было использовать из текущей оболочки, и вы запускаете эту функцию из оболочки, он выйдет из оболочки, потому что оболочка - это контекст, в котором выполняется функция, составляющая
Exit
команду.Примечание. По умолчанию, если щелкнуть правой кнопкой мыши сценарий, чтобы запустить его в PowerShell, после его запуска PowerShell автоматически закроется. Это не имеет ничего общего с
Exit
командой или чем-то еще в вашем скрипте. Это просто поведение PowerShell по умолчанию для сценариев, запускаемых с использованием этого конкретного метода запуска сценария. То же самое верно для командных файлов и окна командной строки.Возврат: возврат к предыдущему пункту вызова. Если вы вызовете эту команду из скрипта (вне каких-либо функций), она вернется в оболочку. Если вы вызовете эту команду из оболочки, она вернется в оболочку (которая является предыдущей точкой вызова для одной команды, запущенной из оболочки). Если вы вызываете эту команду из функции, она вернется туда, откуда была вызвана функция.
Выполнение любых команд после точки вызова, в которую она возвращается, будет продолжено с этой точки. Если скрипт вызывается из оболочки и содержит
Return
команду вне каких-либо функций, то когда он возвращается в оболочку, больше нет команд для выполнения, что делаетReturn
использование таким образом по существу таким же, какExit
.Перерыв: это вырвется из петель и переключит дела. Если вы вызываете эту команду, не находясь в цикле или переключении, она выйдет из сценария. Если вы вызываете
Break
внутри цикла, который вложен в цикл, он будет прерываться только из цикла, в котором он был вызван.Существует также интересная особенность, заключающаяся в том, что
Break
вы можете добавить префикс цикла к метке, а затем выйти из этого помеченного цикла, даже еслиBreak
команда вызывается внутри нескольких вложенных групп в этом помеченном цикле.источник
Exit
может принимать код возврата в качестве параметра (по умолчанию 0) - напримерExit 3
.Get-Command Exit
иGet-Alias Exit
без результатов. Затем я посмотрел, было ли это ключевое слово, и не нашел официальной документации по нему. Однако, глядя на это сейчас, я не знаю, как я пришел к такому выводу. Понятно, что это ключевое слово ( technet.microsoft.com/en-us/library/hh847744.aspx ). Возможно, потому что Exit - это единственное ключевое слово, у которого нет собственной темы about_ help, и поэтому в списке тем на левой боковой панели его нет.Exit
выйдет из PowerShell тоже. Если вы хотите «вырваться» из текущей функции или скрипта - используйтеBreak
:)источник
break
когда хотите просто выйти из текущей функции ... вызов скриптов также может быть нарушен!Write-Error - для ошибок, не заканчивающихся, а throw - для ошибок завершения.
источник
powershell -command "& module-function ..."
. Мне нужно было преобразовать эти функции для преобразования в try-catch обертки и выхода из этой обертки-обертки, чтобы фактически вывести код завершения ошибки.$PSCmdlet.ThrowTerminatingError()
о тех случаях, когда бросок просто не может выполнить работу (известная проблема с отсутствием завершающих ошибок отthrow
)Завершает этот процесс и дает базовой операционной системе указанный код выхода.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
Это позволит вам выйти с определенным кодом выхода, который можно получить у звонящего.
источник
Exit 1
.[Environment]::Exit(1)
имеет побочный эффект выхода из моего окна powershell, когда я вызываю его в скрипте, а использованиеexit
, похоже, не делает этого.Я думаю, что вы ищете
Return
вместоBreak
. Разрыв обычно используется для циклов и разрывается только от самого внутреннего блока кода. Используйте Return для выхода из функции или скрипта.источник
Return
просто вернется из функции, а не из сценария. (Return
на верхнем уровне сценария будет прекращен сценарий, но это не был вопрос.)Создание исключения будет хорошо, особенно если вы хотите выяснить причину ошибки:
Это сгенерирует завершающую ошибку.
источник
Может быть, лучше использовать «ловушку». Ловушка PowerShell указывает кодовый блок, который запускается при завершении или ошибке. Тип
чтобы узнать больше об утверждении ловушки.
источник
По совпадению я обнаружил, что (например, просто , когда метка не существует ), кажется, выходит из всего скрипта (даже изнутри функции) и поддерживает работу хоста. Таким образом, вы можете создать функцию, которая разрывает скрипт из любого места (например, рекурсивный цикл), не зная текущей области (и создавая метки):
Break <UnknownLabel>
Break Script
Script
источник
Я использовал это для перезапуска программы. Я не знаю, поможет ли это, но это простой оператор if, требующий только двух разных записей. Это работает в PowerShell для меня.
Не знаю, поможет ли это, но я верю, что после завершения работы программы будет происходить прекращение работы программы. Однако в этом случае каждый определенный вход требует перечисленных и категоризированных выходных данных. Вы также можете сделать так, чтобы выход вызывал новую строку приглашения и таким образом завершал программу.
источник