如果 PowerShell 中的输出未改变,则重新启动进程

如果 PowerShell 中的输出未改变,则重新启动进程

我有这个命令

for ($i=0; $i -gt -1; $i++) {
    $path = "..."
    ffmpeg -f dshow -i audio="Microphone (USB Microphone)" -y -t 00:10:00 -b:a 128k $path
}

我需要获取命令输出流最后一行的当前状态,然后如果该行在 5 秒内保持不变(陈旧/冻结/挂起),则记录“警告:程序正在冻结。正在尝试重新启动......”,然后停止该过程并重新启动命令。

但我想知道,这可能吗?谢谢你的帮助。

答案1

利用 PowerShell 函数和高级技术,以及有效地附加2> $Log到命令ffmpeg重定向其标准错误输出到指定的日志文件。

这种方法首先定义$path$log$micName变量。然后,定义四个简单的函数,并随后由其他逻辑调用,并使用从一开始就预设的变量。

run-ffmpeg函数包含三个明确定义的参数。而tailchecklogchecks函数则用作$args[0]占位符来捕获通过其函数调用传入的第一个未命名参数。

电源外壳

$path = "D:\ffmpeg\out\test.wav";
$log = "D:\ffmpeg\out\err.log";
$micName = "Microphone (USB Microphone)";
    
Function run-ffmpeg {param([string]$Path,[string]$Log,[string]$MicName)
    $ffmpegCommand = "ffmpeg -f dshow -i audio='$MicName' -y -t 00:10:00 -b:a 128k $Path 2> $Log"
    Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command $($ffmpegCommand)" -WindowStyle Hidden;   
    Start-Sleep -Seconds 4;
    logchecks $Log;
};

Function tail {Get-Content -Path $args[0] -Tail 1};
Function check {tail $args[0]};

Function logchecks {
    do {
        $checklog = check $args[0];
        Start-Sleep -Seconds 5;
        $rechecklog = check $args[0];
    } while ($checklog -ne $rechecklog)
    
    run-ffmpeg -Path $path -Log $log -MicName $micName;  
};

logchecks $log;

逻辑支持说明

  • 2> $Log如前所述实现将ffmpeg命令输出重定向到日志文件。
  • 用于start-process执行ffmpeg逻辑内的命令以确保正常功能。
  • get-content与参数一起使用-tail 1,可以监控日志的最新内容。
  • 实现了一个do while循环,以 5 秒的间隔定期监视日志文件的尾部ffmpeg,确保内容与前 5 秒的检查不同。
  • 在战略要点引入start-sleep延迟,为流程执行后的后续检查留出时间等。

支持资源

相关内容