Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 设置脚本';将退出代码设置为随机值,以模拟间歇性故障_Powershell_Command Line Interface_Exit Code_Visualcron - Fatal编程技术网

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
    -c
    ),则报告的最后一个命令或表达式的成功状态(如PowerShell在自动
    $?
    变量中的内部反映)具有以下含义:

    • 如果脚本调用是传递给
      -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吗