Установите код выхода сценария на случайное значение для имитации периодического сбоя - PullRequest
1 голос
/ 12 мая 2019

У меня есть следующий код:

$ExitCode = Get-Random -InputObject 0, 1

Exit $ExitCode

Кажется, он всегда возвращает 0 в качестве кода выхода.

Я не знаю, правильно ли я закодировал выход или если Get-Random не позволяет установить его в качестве переменной.

Все образцы, которые я вижу в интернете для Get-Random, выводят его на консоль.

Как получить код для выходасо случайным 0 или 1?

[EDIT] Я начинаю думать, что проблема с Exit.

Я закодировал это:

$ExitCode = Get-Random -InputObject 0, 1
#Exit $ExitCode
Exit 1

и я все еще получаю код выхода 0. Я запускаю этот скрипт из VisualCron.Так что это также может быть взлом VisualCron с кодом выхода.Я запускал его как минимум 12 раз, и я не думаю, что Get-Random мог бы каждый раз возвращать 0.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Кажется, он всегда возвращает 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, затем не выполняются.

0 голосов
/ 12 мая 2019

Эта модификация послужила моей цели:

$ExitCode = Get-Random -InputObject 1, 0

if ($ExitCode -ne 0) {
    Throw "exit code is other than 0"
}

Exit 0

Проблема заключалась в том, что сам PowerShell возвращает 0 или 1. 1, если скрипт выдал исключение, и 0, если скрипт не выдал исключение.Цель этого сценария - смоделировать сбой сценариев, чтобы мы могли протестировать нашу систему мониторинга, поэтому выбрасывание исключения - это хорошо для моих целей.

Из-за чувства честной игры я не принимаю свои собственные ответыпока я не дам хороший шанс другим ответить.Если новичок хочет скопировать мой ответ и добавить что-то к нему, сделайте это, и я приму ваш ответ и удалю мой.

...