Возврат кода завершения из скрипта PowerShell - PullRequest
0 голосов
/ 06 мая 2018

У меня есть вопросы о возврате значения кода выхода из PowerShell при запуске из вызова cmd.exe. Я нашел https://weblogs.asp.net/soever/returning-an-exit-code-from-a-powershell-script, что было полезно. Но решение для кода PowerShell состоит в добавлении функции.

function ExitWithCode { param($exitcode) $host.SetShouldExit($exitcode) exit }

Формирует:

ExitWithCode : The term 'ExitWithCode' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At C:\src\t\e\exit5.ps1:6 char:1
+ ExitWithCode -exitcode 12345
+ ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ExitWithCode:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Но, размещение «выхода» на новой строке работает. Это просто языковая аномалия?

function ExitWithCode { param($exitcode) $host.SetShouldExit($exitcode)
exit }

Кроме того, эта страница с 2010 года. Это все еще текущее состояние? Есть ли лучший / более простой способ сейчас?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Как уже объяснил Гюнтер Шмитц, $host.SetShouldExit($exitcode) и exit - это два разных утверждения, которые должны быть разделены либо новой строкой, либо точкой с запятой.

Без этого разделения ваш код должен выдать другую ошибку, однако:

Неожиданный токен 'exit' в выражении или выражении.

Ошибка, которую вы опубликовали, больше похожа на то, что вы пытались использовать эту функцию без ее предварительного определения.

Цель функции - установить правильный код выхода при выходе из скрипта независимо от того, как скрипт был запущен. Обычно вы запускаете сценарии PowerShell следующим образом:

powershell.exe -File "C:\your.ps1"

И в этом случае достаточно простого exit $exitcode:

C:\> <b>type test1.ps1</b>
exit 23
C:\> <b>powershell -File .\test1.ps1</b>

C:\> <b>echo %errorlevel%</b>
23

Однако другой способ выполнения сценариев PowerShell - это параметр -Command (поскольку сценарии PowerShell можно запускать непосредственно из PowerShell). Разница между параметрами -File и -Command заключается в том, что последний возвращает только 1 или 0 (указывая, завершился ли сценарий с ненулевым кодом выхода), но не сам код выхода.

C:\> <b>powershell -Command .\test1.ps1</b>

C:\> <b>echo %errorlevel%</b>
1

При полном отсутствии параметра PowerShell по умолчанию устанавливается -Command (что позволяет легко запускать операторы PowerShell из командной строки):

C:\> <b>powershell .\test1.ps1</b>

C:\> <b>echo %errorlevel%</b>
1

Определение кода выхода с помощью $host.SetShouldExit() гарантирует, что код выхода возвращается правильно, когда скрипт вызывается с помощью powershell. -Command. Вы все равно должны выйти с фактическим кодом выхода, потому что в противном случае код выхода будет только установлен при запуске скрипта через powershell.exe -Command, но не при запуске скрипта через powershell.exe -File * * 1040

C:\> <b>type test2.ps1</b>
function ExitWithCode($exitcode) {
  $host.SetShouldExit($exitcode)
  <b><i>exit</i></b>
}
ExitWithCode 23
C:\> <b>powershell -File .\test2.ps1</b>

C:\> echo %errorlevel%
<b><i>0</i></b>                                <i># &larr; exit without argument defaults to 0!</i>

C:\> <b>powershell -Command .\test2.ps1</b>

C:\> <b>echo %errorlevel%</b>
23
C:\> <b>type test3.ps1</b>
function ExitWithCode($exitcode) {
  $host.SetShouldExit($exitcode)
  <b><i>exit $exitcode</i></b>
}
ExitWithCode 23
C:\> <b>powershell -File .\test3.ps1</b>

C:\> echo %errorlevel%
<b><i>23</i></b>

C:\> <b>powershell -Command .\test3.ps1</b>

C:\> <b>echo %errorlevel%</b>
23
0 голосов
/ 06 мая 2018

Чтобы вернуть код выхода из PowerShell, нужно набрать exit $exitcode. Внутренне, когда среда выполнения обрабатывает ключевое слово exit, оно вызовет для вас $host.SetShouldExit($exitcode). Но имейте в виду, что exit также завершает работу скриптов, поэтому важно, как вы запускаете скрипт. Если вы хотите запустить скрипт, который вызывает exit из powershell.exe, используйте параметр -File вместо -Script, как в

powershell -File scriptThatCallsExit
0 голосов
/ 06 мая 2018

$host.SetShouldExit($exitcode) и exit - две команды, которые должны разделяться. либо с возвратом (как вы упомянули), либо с точкой с запятой:

function ExitWithCode { param($exitcode) $host.SetShouldExit($exitcode); exit }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...