Как уже объяснил Гюнтер Шмитц, $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># ← 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