2016-03-14 4 views
1

У меня есть интерактивная PowerShell с использованием оконных форм, что означает, что скрипт PowerShell отображает некоторые элементы управления в форме, запрашивающей ввод, и, наконец, запускает robocopy, когда пользователь нажимает кнопку.write robocopy output to console and log file

Это простой сценарий, отображающий проблему. Вы можете скопировать код, сохранить его в сценарий Power Sell и запустить. Для успешного запуска нужна папка: \ tmp \ tmp, см. Функцию CopyFolder.

function createdMainForm { 
    $mainForm = New-Object System.Windows.Forms.Form 

    $btn = New-Object System.Windows.Forms.Button 

    $btn.Text = "RoboCopy" 

    #register click event 
    $btn.add_click({Add_click}) 

    $mainForm.Controls.Add($btn) 

    $mainForm.ShowDialog() 
} 

#click event 
function Add_click() { 
    CopyFolder 
} 

function CopyFolder() { 
    $sourseFolder = "C:\tmp\tmp" 
    $targetFolder = "C:\tmp\tmp2" 

    $Logfile = "c:\tmp\a.log" 

    robocopy $sourseFolder $targetFolder /tee /log:$Logfile 
} 

function ReadMode() { 
    Write-Host Mode [1 for GUI mode] 

    $mode = Read-Host 

    if ($mode -eq 1) { 
     createdMainForm 
    } else { 
     CopyFolder 
    } 
} 

ReadMode 

Я хочу, чтобы захватить robocopy прогресс в лог-файл, а также в консоли.

Однако только файл журнала фиксирует вывод, а консоль «висит» до конца.

Я обнаружил, что работает плавно, когда PowerShell не отображает форму, а просто запускает команду. Сценарий работает в двух режимах. введите 1 для «режима формы» что-нибудь еще для консольного режима, где журнал фактически записан в консоль и файл.

Как я могу использовать форму и отображать прогресс в консоли?

+0

выполнить Robocopy на фоне работы, а также получать данные в конце концов, таким образом, форма не будет замораживать, а также вы можете использовать таймер для проверки определенных интервалов, выполнит ли задание, а затем получит данные. – Avshalom

+0

Трудно что-то предложить, не видя ваш код. В настоящее время это звучит так, как будто вы хотите писать в трубопровод из обработчика событий окна GUI. Это то, что вы пытаетесь сделать? – PetSerAl

+0

PetSerAI, да, вы правы. добавлен код в вопрос. – OJNSim

ответ

1

Используйте правильное robocopy parameters:

/log:<LogFile> Записывает вывод о состоянии в лог-файл (перезаписывает существующий файл журнала).
& hellip;
/tee Записывает вывод состояния в окно консоли, а также в файл журнала.

robocopy $s $t /tee /log:C:\path\to\your.log 

Что касается обновления выхода вашего встроенного контроля, вы, вероятно, необходимо обновить форму на timer:

$timer = New-Object Windows.Forms.Timer 
$timer.Interval = 1000 
$timer.add_tick({$form.Refresh()}) 

Пуска таймер при вызове robocopy и остановить его после завершения команды , Детали будут зависеть от вашего фактического кода (который вы выбрали для пропусков).


Edit: Я думаю, что я наконец-то понял, что вы пытаетесь достичь, и какие проблемы вы получаете там.

Вы используете robocopy из скриптового блока, связанного с элементом формы. Из-за этого выход STDOUT не переходит в консоль. Вы должны взять на себя robocopy вывод (success output stream) и записать его на принимающей консоли себя:

function CopyFolder() { 
    ... 
    robocopy $sourseFolder $targetFolder /tee /log:$Logfile | Write-Host 
}
+0

Возможно, я был недостаточно ясен или я полностью не слежу за вами ... Я изменил вопрос с помощью соответствующего кода. Может быть, это будет более ясно. – OJNSim

+0

Этот крошечный фрагмент даже не достаточно удален, чтобы сделать что-то более ясным. Сделайте этот фрагмент [минимальным, полным и проверяемым примером] (http://stackoverflow.com/help/mcve). –

+0

ОК, я чувствовал, что этого достаточно. Извините, я редактировал вопрос. Теперь он содержит полный скрипт, отображающий файл issue.tx. – OJNSim