我有这个命令
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
函数包含三个明确定义的参数。而tail
、check
和logchecks
函数则用作$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
延迟,为流程执行后的后续检查留出时间等。