我有以下代码:
$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。
答案 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.exe
)并不总是传递脚本的exit
代码值,具体取决于调用方式:
如果您使用-File
来调用脚本(如果您要做的只是调用一个脚本,则应该这样做),脚本的退出代码将正确地传递(报告为powershell.exe
的退出代码。
相比之下,如果您使用-Command
(-c
),则它是成功状态-因为PowerShell在内部自动反映在$?
中变量-报告的 last 命令或表达式的变量-具有以下含义:
如果调用脚本是传递给-Command
的最后一个命令,则其退出代码将映射到0
或1
上;也就是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。该脚本的目的是模拟失败的脚本,以便我们可以测试监视系统,因此抛出异常对我而言很好。
出于公平竞争的考虑,我不会接受自己的答案,除非我给其他人一个很好的回答的机会。如果新手想复制我的答案并添加一些内容,请这样做,我会接受您的答案并删除我的答案。