将脚本的退出代码设置为随机值以模拟间歇性故障

Set a script's exit code to a random value to simulate intermittent failure

我有以下代码:

$ExitCode = Get-Random -InputObject 0, 1

Exit $ExitCode

似乎总是 return 0 作为退出代码。

我不知道是我把出口编码错了还是Get-Random不允许将它设置为变量。

我在 Get-Random 的互联网上看到的所有示例都将其打印到控制台。

如何让代码以随机 0 或 1 退出?

[编辑] 我开始认为问题出在 Exit

我这样编码:

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

我仍然得到退出代码 0。我正在 运行从 VisualCron 中安装这个脚本。所以它也可能是 VisualCron 处理退出代码。我有 运行 它至少 12 次我不认为 Get-Random 每次都 returning 0.

It seems to always return 0 as an exit code.

否:只有 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."

您通常会看到 single-digit 范围内的值,即少于 10 次调用。


Exit-code 使用 PowerShell CLI 时报告:

问题在于 PowerShell CLI(使用参数调用 powershell.exe)并不总是传递脚本的 exit 代码值,这取决于它是如何被调用的:

  • 如果您使用 -File 调用脚本(如果您所做的只是调用单个脚本,您应该这样做),则脚本的退出代码 - 假设它已明确设置为 exit - 正确通过(报告为 powershell.exe 的退出代码。

  • 相比之下,如果您使用 -Command (-c),则它是 成功状态 - 正如 PowerShell 内部反映的报告的 last 命令或表达式的自动 $? 变量,具有以下含义:

    • 如果调用脚本是传递给 -Command 的最后一个命令,它的退出代码将映射到 01;也就是说,0 被传递,但是 任何非零 值被报告为 1.

    • 如果您的脚本调用不是最后一个命令,最后一个命令的成功状态决定了整个退出代码(同样,01);请注意,将脚本调用包含在 (...) 中这样微妙的事情使得它不再是 6.x.

      版本中的最后一个命令

有关其他信息,请参阅

因此,确保通过 exit <n> 设置的脚本退出代码:

  • 如果可能,使用-File

  • 如果必须使用-Command,因为必须执行额外的命令:

    • ; exit $LASTEXITCODE 附加到您的 -Command 参数(如果您调用退出代码为 的外部程序 ,您也会这样做想通过)。

    • 或者,如在 中,您可以在脚本中使用 throw 来强制报告退出代码 1,但请注意 throw 立即中止 处理,以便传递给 -Command 的剩余命令然后 不会 执行。

此修改符合我的目的:

$ExitCode = Get-Random -InputObject 1, 0

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

Exit 0

问题是 powershell 本身 returns 0 或 1。如果脚本抛出异常则为 1,如果脚本未抛出异常则为 0。这个脚本的目的是模拟脚本失败,这样我们就可以测试我们的监控系统,所以抛出异常对我来说很好。

出于公平竞争的考虑,我不接受自己的回答,除非我给其他人一个很好的回答机会。如果新手想复制我的答案并添加一些东西,请这样做,我会接受你的答案并删除我的。