Перенаправить запись-хост в текстовое поле в форме?

Я полагаю, что мой вопрос несколько похож на этот: Стандартный вывод/ввод/ошибка в/из текстового поля, но он ориентирован на powershell.

Я работаю над графическим интерфейсом, созданным с использованием PrimalForms, который будет выступать в качестве внешнего интерфейса для сценариев развертывания моего веб-сайта. До сих пор я использовал start-transcript и stop-transcript для обновления своего текстового поля в графическом интерфейсе, который действует как консоль для просмотра событий процесса сценария.

Однако теперь я собираюсь использовать скрипт для нашего балансировщика нагрузки, который более чувствителен ко времени. Мне нужно, чтобы текстовое поле могло отображать вывод (который направлен на запись-хост указанным сценарием) в режиме реального времени или близко к нему. Захват лог-файла/расшифровки постфактум просто не годится.

Я читал «Понимание вывода» и все статьи, которые я мог найти, но я не вижу метода, который действительно работал бы для моих нужд. Я надеялся, что есть просто командлет «set-host», который я мог бы использовать и направить в него все мои записи на хосте.

Любые идеи?

Редактировать: я рассматривал возможность подключения к текстовому файлу с исходящей строкой и периодического обновления из него, но это похоже на настоящий кладж.

Edit2: хм, может быть, объект Tee... Powershell: как захватить вывод с хоста

Edit3: Хорошо, я почти закончил:

ping -n 10 127.0.0.1 | out-string -Stream | foreach-object {$richTextBox1.lines = $richTextBox1.lines + $_}

но, похоже, он зависает, а не течет.


person Yanagi    schedule 24.08.2010    source источник


Ответы (1)


Ладно, кажется, я нашел работающее решение. Проблема с моим окончательным редактированием выше заключалась не в том, что исходящая строка не была потоковой, а в том, что я не обновлял форму при каждой дополнительной строке.

Вот пример идеи для тех, кто заинтересован (я также включил пару строк для автоматической прокрутки текстового поля):

ping -n 10 127.0.0.1 | out-string -Stream | foreach-object {
    $richTextBox1.lines = $richTextBox1.lines + $_
    $richTextBox1.Select($richTextBox1.Text.Length, 0)
    $richTextBox1.ScrollToCaret()
    $form1.Update()}

Решение для захвата Write-Host немного отличается; по существу ведение журнала из другого экземпляра powershell:

Powershell.exe -noprofile -file .\psbackup.ps1 $txtbox_codePath.text $comboBox_environment.selecteditem | Out-String -Stream | ForEach-Object {
    $txtBox_console.Lines = $txtBox_console.Lines + $_
    $txtBox_console.Select($txtBox_console.Text.Length, 0)
    $txtBox_console.ScrollToCaret()
    $form1.Update()
}
person Yanagi    schedule 24.08.2010
comment
ПРИМЕЧАНИЕ На самом деле это не решает проблему захвата операторов write-host. В строку передаются только объекты, а затем импровизированная консоль. - person Yanagi; 24.08.2010