首页 > 解决方案 > Powershell - 在输出某个字符串时终止命令

问题描述

我有一个在 PowerShell 中运行的命令,它会意外出错(每当网络连接饱和时,它就会出错)

出错后,它将不再按预期运行,但会继续运行。该错误也不会像标准文本一样打印为错误。

我想让命令在一个循环中运行,该循环检测它何时出错,然后杀死它,然后重新启动它,但我无法找到任何关于实时解析命令输出的信息。

例如:foo.ps1每秒输出一个数字,但会随机开始每秒输出一次“ERROR: CONNECTION SATURATED”。如何创建一个循环来检测它,终止进程并重新启动它?

编辑: 命令错误 这是命令错误的样子。如您所见,错误 ( Warning: ring buffer overflow!!!) 打印为标准输出,而不是错误。

标签: powershellloopserror-handlingcommand

解决方案


不用说,您不能使用标准的 PowerShell 错误处理机制,因为您的命令既不会引发异常,也不会写入错误流。因此,您必须在生成命令的输出时(即异步)对其进行解析。

运行命令并异步访问其输出的最简单方法是使用作业。因此,以下脚本应该完成您的要求:

param(
    # Specifies the commands to run in the job.
    [ScriptBlock] $ScriptBlock,

    # Specifies the text for which to search in each line of the output.
    [string] $Pattern = '^\s*(Warning|Error)',

    # Specifies how long to sleep in seconds between output searches.   
    [int] $Seconds = 1
)

while ($true) {
    $job = Start-Job $ScriptBlock
    while ($job.State -eq 'Running') {
        $output = Receive-Job $job
        if ($output -match $Pattern) {
            break
        }
        Start-Sleep $Seconds
    }
    Stop-Job $job
}

根据您的要求,您可能还希望:

  • 扩展可接受的工作状态集。
  • 如果遇到某些特定的作业状态或其他输出模式,则完全终止脚本(即不重新启动作业)。

推荐阅读