Как зафиксировать прогресс внешних команд в PowerShell? - PullRequest
2 голосов
/ 18 февраля 2020

Я использую скрипт PowerShell для синхронизации файлов между сетевыми каталогами. Robocopy работает в фоновом режиме.

Чтобы захватить вывод и предоставить статистику пользователю, в настоящее время я делаю что-то вроде:

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

Как только это будет сделано, пользовательский windows Форма представлена ​​многострочным текстовым полем, содержащим строку вывода.

Однако выполнение этого способа останавливает выполнение скрипта до тех пор, пока не будет выполнено копирование файла. Поскольку все остальные экраны ввода представляются пользователю в виде графических диалогов, я хотел бы предоставить пользователю информацию о прогрессе в графическом виде.

Существует ли способ захвата stdout из robocopy, на лету ?

Тогда следующий вопрос будет:

Как передать этот вывод в форму с текстовым полем?

1 Ответ

2 голосов
/ 18 февраля 2020

Вы можете запустить задание 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
...