Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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_Loops_Error Handling_Command - Fatal编程技术网

Powershell-输出特定字符串时终止命令

Powershell-输出特定字符串时终止命令,powershell,loops,error-handling,command,Powershell,Loops,Error Handling,Command,我在PowerShell中运行了一个命令,它将不可预测地出错(每当网络连接饱和时,它就会出错) 出现错误后,它将不再按预期运行,而是继续运行。错误也不会作为错误打印,就像标准文本一样 我想让命令在循环中运行,该循环检测它何时出错,然后杀死它,然后重新启动它,但是我无法找到任何关于实时解析命令输出的信息 例如:foo.ps1每秒输出一个数字,但将随机开始每秒输出一次“错误:连接饱和”。如何创建一个循环来检测、终止进程并重新启动它 编辑: 这就是命令出错的样子。如您所见,错误(警告:环形缓冲区溢出!

我在PowerShell中运行了一个命令,它将不可预测地出错(每当网络连接饱和时,它就会出错)

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

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

例如:
foo.ps1
每秒输出一个数字,但将随机开始每秒输出一次“错误:连接饱和”。如何创建一个循环来检测、终止进程并重新启动它

编辑:
这就是命令出错的样子。如您所见,错误(
警告:环形缓冲区溢出!!!
)打印为标准输出,而不是错误。

您可以使用trap关键字检测错误并处理它,即

function Test {
    Write-Host "Doing something..."
    trap {
        Write-Host "Error found:"
        break
    }

    Write-Host "Code should not reach here"
}
要捕获特定异常,可以指定要捕获的内容

...
trap [TheExceptionYouWantToCatch]{
...
}
...

您可以使用trap关键字来检测错误并进行处理,即

function Test {
    Write-Host "Doing something..."
    trap {
        Write-Host "Error found:"
        break
    }

    Write-Host "Code should not reach here"
}
要捕获特定异常,可以指定要捕获的内容

...
trap [TheExceptionYouWantToCatch]{
...
}
...
这很奇怪,但是“select-first 1”在找到答案时会终止管道。这样只会运行5秒钟

& { foreach ($i in 1..10) { $i; sleep 1 } } | where { $_ -eq 5 } | 
  select -first 1  
这很奇怪,但是“select-first 1”在找到答案时会终止管道。这样只会运行5秒钟

& { foreach ($i in 1..10) { $i; sleep 1 } } | where { $_ -eq 5 } | 
  select -first 1  

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

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

param(
#指定要在作业中运行的命令。
[ScriptBlock]$ScriptBlock,
#指定要在输出的每一行中搜索的文本。
[string]$Pattern='^\s*(警告|错误)',
#指定两次输出搜索之间的睡眠时间(秒)。
[int]$Seconds=1
)
while($true){
$job=开始作业$ScriptBlock
while($job.State-eq‘Running’){
$output=接收作业$Job
if($output-匹配$Pattern){
打破
}
开始睡眠$s
}
停止工作$Job
}
根据您的要求,您可能还希望:

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

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

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

param(
#指定要在作业中运行的命令。
[ScriptBlock]$ScriptBlock,
#指定要在输出的每一行中搜索的文本。
[string]$Pattern='^\s*(警告|错误)',
#指定两次输出搜索之间的睡眠时间(秒)。
[int]$Seconds=1
)
while($true){
$job=开始作业$ScriptBlock
while($job.State-eq‘Running’){
$output=接收作业$Job
if($output-匹配$Pattern){
打破
}
开始睡眠$s
}
停止工作$Job
}
根据您的要求,您可能还希望:

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

我尝试过使用trap,但命令给出的“错误”不是一个实际的可捕获错误,它只是一个常规stdout,区别于常规行为的唯一方法是它始终是相同的文本,这与正常行为不同(确切的文本是
环形缓冲区溢出!!!
,该字符串在正常行为中从未出现过)我不需要花太多时间来捕获标准输出,但快速搜索让我找到了这个()答案,也许它可以帮助您将标准输出放入
尝试
/
陷阱
区块我尝试过使用陷阱,但是“错误”命令给出的不是实际的可捕获错误,它只是常规的标准输出,区别于常规行为的唯一方法是它始终是相同的文本,这与正常行为不同(确切的文本是
Ring buffer overflow!!!
,该字符串在正常行为中从不出现)我不需要在捕获标准输出方面做太多工作,但是快速搜索让我找到了这个()答案,也许它可以帮助您将标准输出放入
try
/
陷阱