Кажется, он всегда возвращает 0 в качестве кода выхода.
Нет. Имея всего 2 возможных случайных значения, весьма часто получать одно и то же значение несколько раз подряд.
Другими словами: ваш код по своей природе работает нормально , может быть просто удивительно, что об одном и том же значении можно сообщать несколько раз подряд.
Однако, независимо, фактический код выхода может быть потерян, в зависимости от того, как ваш скрипт вызывается через PowerShell CLI , что VisualCron также позволяет вам использовать - см. Нижнюю часть.
Вы можете проверить, что в конечном итоге вы получите оба значения с помощью следующего фрагмента, который печатает - случайно изменяющееся - число итераций, пока оба значения не будут возвращены:
$count = 0
$have0 = $have1 = $false
do {
++$count
$val = Get-Random -InputObject 0, 1
if ($val -eq 0) { $have0 = $true }
else { $have1 = $true }
if ($have0 -and $have1) { break }
} while ($true)
"Both 0 and 1 returned after $count attempts."
Обычно вы видите значения в однозначном диапазоне, т. Е. Менее 10 вызовов.
Отчет о выходе из кода при использовании PowerShell CLI:
Проблема в том, что интерфейс командной строки PowerShell (вызывающий powershell.exe
с аргументами) не всегда пропускает значение кода exit
скрипта, в зависимости от того, как он был вызван:
Если вы используете -File
для вызова скрипта (что следует делать, если все, что вы делаете, это вызываете один скрипт), код завершения скрипта проходит правильно (сообщается как код выхода powershell.exe
) .
В отличие от этого, если вы используете -Command
(-c
), это успешный статус - так как PowerShell внутренне отражается в автоматической переменной $?
- последняя команда или выражение, о которых сообщается, что имеет следующие последствия:
Если вызов вашего скрипта является последней командой, переданной -Command
, его код завершения отображается на 0
или 1
; то есть 0
пропущено, но любое ненулевое значение сообщается как 1
.
Если вызов вашего сценария , а не последней команды, то статус успешной последней команды определяет общий код завершения (опять же, 0
или 1
); обратите внимание, что что-то столь же тонкое, как включение вызова скрипта в (...)
, делает его больше не последней командой.
Следовательно, , чтобы гарантировать, что код выхода вашего скрипта будет передан через :
Используйте -File
, если возможно.
Если вы должны использовать -Command
, потому что должны выполняться дополнительные команды:
добавьте ; exit $LASTEXITCODE
к вашему -Command
аргументу.
в качестве альтернативы, как и в вашем собственном ответе, вы можете использовать Throw
внутри скрипта для принудительного создания отчетов о коде выхода 1
, но учтите, что Throw
прерывает обработку мгновенно, поэтому что остальные команды, переданные -Command
, затем не выполняются.