首页 > 解决方案 > 如何在 PowerShell 中捕获外部命令进度?

问题描述

我正在使用 PowerShell 脚本在网络目录之间同步文件。Robocopy 在后台运行。

为了捕获输出并向用户提供统计信息,目前我正在执行以下操作:

$out = (robocopy $src $dst $options)

完成后,将显示一个自定义窗口表单,其中包含一个包含输出字符串的多行文本框。

但是,这样做会暂停脚本执行,直到文件复制完成。由于所有其他输入屏幕都以图形对话框的形式呈现给用户,因此我想以图形方式为用户提供进度输出。

有没有办法在飞行中捕获stdout来自?robocopy

那么下一个问题将是:

如何将该输出传输到带有文本框的表单中?

标签: powershellrobocopy

解决方案


您可以在后台运行 robocopy 作业并继续检查进度。

Start-Job将在后台启动该过程
Receive-Job将为您提供迄今为止已打印的所有数据。

$job = Start-Job -scriptBlock { robocopy $using:src $using:dst $using:options }

$out = ""
while( ($job | Get-Job).HasMoreData -or ($job | Get-Job).State -eq "Running") { 
    $out += (Receive-job $job)
    Write-output $out 
    Start-Sleep 1
}

Remove-Job $job

推荐阅读