powershell - Powershell - 在输出某个字符串时终止命令
问题描述
我有一个在 PowerShell 中运行的命令,它会意外出错(每当网络连接饱和时,它就会出错)
出错后,它将不再按预期运行,但会继续运行。该错误也不会像标准文本一样打印为错误。
我想让命令在一个循环中运行,该循环检测它何时出错,然后杀死它,然后重新启动它,但我无法找到任何关于实时解析命令输出的信息。
例如:foo.ps1
每秒输出一个数字,但会随机开始每秒输出一次“ERROR: CONNECTION SATURATED”。如何创建一个循环来检测它,终止进程并重新启动它?
编辑:
命令错误
这是命令错误的样子。如您所见,错误 ( Warning: ring buffer overflow!!!
) 打印为标准输出,而不是错误。
解决方案
不用说,您不能使用标准的 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
}
根据您的要求,您可能还希望:
- 扩展可接受的工作状态集。
- 如果遇到某些特定的作业状态或其他输出模式,则完全终止脚本(即不重新启动作业)。
推荐阅读
- c - 退出代码 11 - 如何修复它
- r - Sekhon 从 R 中的 Matching 包中获取匹配的数据集
- reactjs - 如何使用带有 React Hooks 的 setState 从 local.storage 设置 JSON 对象
- excel - 形状和文本框无法在单元格中正确打印
- swift - 我可以将按钮连接到 xcode 中新的 swift 文件中的结构吗?
- python - 初学者python游戏:掷骰子,while循环问题
- python - 变量自动赋值和递增
- aws-sdk - AWS IoT 连接错误:aws-iot-device-sdk 提供的“caCert”选项无效
- python - 如何从 ffprobe 设置变量
- wordpress - ACF 前端字段复选框:标记为已读