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

时间:2019-05-12 00:04:09

标签: powershell command-line-interface exit-code visualcron

我有以下代码:

$ExitCode = Get-Random -InputObject 0, 1

Exit $ExitCode

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

我不知道出口编码是否错误,或者Get-Random是否不允许将其设置为变量。

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

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

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

我对此进行了编码:

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

,我仍然得到退出代码0。我正在从VisualCron运行此脚本。因此,也可能是VisualCron修改了退出代码。我已经运行了至少12次,我认为Get-Random不会每次都返回0。

2 个答案:

答案 0 :(得分:1)

  

似乎总是返回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 CLI(使用参数调用powershell.exe)并不总是传递脚本的exit代码值,具体取决于调用方式:

  • 如果您使用-File来调用脚本(如果您要做的只是调用一个脚本,则应该这样做),脚本的退出代码将正确地传递(报告为powershell.exe的退出代码。

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

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

    • 如果脚本的调用不是最后一个命令,则最后一个命令的成功状态决定了总体退出代码(再次是0或{{1} });请注意,与将脚本调用括在1中一样微妙的事情使它不再是最后一个命令。

因此,要确保脚本的退出代码是通过传递的:

  • 如有可能,请使用(...)

  • 如果必须使用-File,因为必须执行附加命令:

    • 在您的-Command参数后面加上; exit $LASTEXITCODE

    • 或者,就像您自己的回答一样,您可以在脚本内使用-Command来强制报告退出代码Throw,但请注意1 中止< / em>立即进行处理,因此传递给Throw的其余命令将执行。

答案 1 :(得分:0)

此修改符合我的目的:

$ExitCode = Get-Random -InputObject 1, 0

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

Exit 0

问题在于powershell本身返回0或1。如果脚本引发异常,则返回1;如果脚本未引发异常,则返回0。该脚本的目的是模拟失败的脚本,以便我们可以测试监视系统,因此抛出异常对我而言很好。

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