Powershell 设置脚本';将退出代码设置为随机值,以模拟间歇性故障
我有以下代码:Powershell 设置脚本';将退出代码设置为随机值,以模拟间歇性故障,powershell,command-line-interface,exit-code,visualcron,Powershell,Command Line Interface,Exit Code,Visualcron,我有以下代码: $ExitCode = Get-Random -InputObject 0, 1 Exit $ExitCode 它似乎总是返回0作为退出代码 我不知道出口是否编码错误,或者Get Random是否不允许将其设置为变量 我在Get Random的互联网上看到的所有样本都会打印到控制台上 如何让代码以随机0或1退出 [编辑] 我开始认为问题出在退出 我把这个编码了: $ExitCode = Get-Random -InputObject 0, 1 #Exit $ExitCode
$ExitCode = Get-Random -InputObject 0, 1
Exit $ExitCode
它似乎总是返回0作为退出代码
我不知道出口是否编码错误,或者Get Random
是否不允许将其设置为变量
我在Get Random
的互联网上看到的所有样本都会打印到控制台上
如何让代码以随机0或1退出
[编辑]
我开始认为问题出在退出
我把这个编码了:
$ExitCode = Get-Random -InputObject 0, 1
#Exit $ExitCode
Exit 1
我仍然得到出口代码0。我正在从VisualCron运行此脚本。因此,这也可能是VisualCron破坏了出口代码。我至少运行了12次,我不认为GetRandom每次都返回0
它似乎总是返回0作为退出代码
否:只有两个可能的随机值,在一行中多次接收相同的值并不少见
换言之:您的代码本质上运行良好,同一个值可以连续多次报告,这可能会令人惊讶
但是,实际的退出代码可能会丢失,具体情况取决于通过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
)将正确传递(报告为exit
)的退出代码powershell.exe
- 相反,如果使用
(-Command
),则报告的最后一个命令或表达式的成功状态(如PowerShell在自动-c
变量中的内部反映)具有以下含义:$?
- 如果脚本调用是传递给
的最后一个命令,则其退出代码将映射到-command
或0
;也就是说,1
被传递,但任何非零值都报告为0
1
- 如果脚本的调用不是最后一个命令,则最后一个命令的成功状态决定了整个退出代码(同样,
或0
);请注意,将脚本调用包含在1
中这样微妙的事情使它不再是6.x版本之前的最后一个命令(…)
- 如果脚本调用是传递给
退出
:
- 如果可能,使用
-文件
- 如果必须使用
,因为必须执行其他命令:-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本身将返回0或1.1,如果脚本未引发异常,则返回0。此脚本的目的是模拟失败的脚本,以便我们可以测试监控系统,因此引发异常对我来说很好
出于公平的考虑,我不会接受我自己的答案,除非我给了别人一个很好的回答机会。如果一个新手想复制我的答案并添加一些内容,请这样做,我会接受你的答案并删除我的。范围如此之小……你只是得到一个随机选择,碰巧是
0
[grin]我尝试了您的代码,目前收到了大量1
,只有少数0
——大约是5比1。/////或0..1
。这只是为了可读性,所以请使用适合您的风格。总结一下:Get Random
问题的一部分是转移注意力,而Get Random
的工作原理与预期一致。不相关的问题是PowerShell CLI如何从脚本中继退出代码。使用Throw
而不是退出
强制PowerShell报告退出代码1
,但除了修改脚本,还有更好的选择-我更新了答案,以显示它们,并讨论退出代码报告的一般逻辑。在目前的形式中,您的问题侧重于转移注意力,而您的答案没有解决这一方面,也没有解决这一方面的问题它解释了为什么Throw
会产生不同。@mklement0我将检查您的答案是否正确。我的问题是,我正在从作业控制器调用powershell,我不知道如何调用它,因为它是通过--File完成的。我将向VisualCron支持人员寻求指导,但我的答案适用于我非常受限的case、 谢谢;您的答案确实有效,但不必修改您的脚本。我不熟悉VisualCron;您是说它构建了ca吗