在 Powershell Core 中,当从脚本块中运行时,是否可以将本机进度输出到控制台主机窗口?

问题描述 投票:0回答:1

我想从 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()
}
powershell console output
1个回答
0
投票

一些一般建议:

  • 要在当前控制台窗口中同步执行控制台应用程序或批处理文件,请直接调用它们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
输出也被输出:

    重定向的 stderr 行在
  • red

    中打印,并且 - 在 Windows PowerShell 中 - first stderr 行打印 就好像它是 PowerShell 错误(在 PowerShell (Core) 7+ 中不再是问题).

    另外,
      存在
    • 一个影响 PowerShell(核心)7.3.x 至至少 7.3.10 的错误:在常规控制台窗口 (conhost.exe) 中(与在
      Windows 终端
      中相反),ANSI/VT在涉及本机(外部程序)的管道中,基于转义码的着色渲染不正确 - 请参阅 GitHub 问题 #18771,该问题已被不当关闭。
  • 为避免这种情况,请在
  • ForEach-Object ToString

    之前插入

    Out-Host
    管道段。
    
    

  • 如果您直接调用脚本块
(通常通过

&调用运算符

),则不需要
Out-Host,外部程序的输出将流式传输到PowerShell的成功输出流

    

© www.soinside.com 2019 - 2024. All rights reserved.