我想从 powershell 中的 Restic Backup 或 yt-dlp 等本机程序中获取进度输出,即使我是从这样的块中运行该程序。内部脚本块是否可以像直接执行时一样输出到控制台?我可以控制executeWithPidLock 实现。
executeWithPidLock {
.\restic.exe -r temp-repo backup 'C:\Tools\AlwaysMouseWheel'
}
我知道我可以使用这样的新窗口运行并获得控制台进度输出,这并不是那么糟糕,但不是我真正想要的,因为我不希望从任务计划程序运行时弹出窗口:
measure-command {
$process = Start-Process -FilePath "./restic" -ArgumentList @("-r", "temp-repo","backup",'C:\Tools\') -PassThru -Wait
$process.WaitForExit()
}
一些一般建议:
c:\path\to\some.exe ...
或
& $exePath ...
)。这还允许您直接捕获它们的输出,并稍后通过
$LASTEXITCODE
查询它们的退出代码。不要使用
Start-Process
(或它所基于的 System.Diagnostics.Process
API) - 请参阅这个答案。 GitHub 文档问题 #6239 提供了有关何时使用
Start-Process
合适或不合适的指导。
逐行流式传输到管道,因此您可以在发出时查看或处理行,甚至可以在脚本块内部({ ... }
) )。
的脚本块是一种特殊情况,因为后者显式地抑制脚本块中命令的输出。
Out-Host
解决此问题 - 对于 仅显示
输出 - 如下例所示,这也演示了输出的流式传输性质:
Measure-Command {
cmd /c 'echo 1 & timeout 2 >NUL & echo err >&2 & echo 2' *>&1 | Out-Host
}
1
将立即打印,即使命令尚未执行完毕。
注意使用 redirection *>&1
来确保
stderr输出也被输出:
中打印,并且 - 在 Windows PowerShell 中 - first stderr 行打印 就好像它是 PowerShell 错误(在 PowerShell (Core) 7+ 中不再是问题).
另外,ForEach-Object ToString
之前插入
Out-Host
管道段。
&
,调用运算符
),则不需要
Out-Host
,外部程序的输出将流式传输到PowerShell的成功输出流