2016-11-14 4 views
1

Я создал интерфейс powershell, который по существу собирает информацию, а затем отправляет эту информацию на внешний скрипт PS через Start-Job. У меня есть таймер, который запускает работу-каждую секунду и обновляет окно вывода с STDOUT из заданий, которые я создал.Регистрация результатов работы Powershell

Внешний PS Автор сценария:

Этот скрипт имеет множество функций (которые используют многие командлеты), и будет печатать сообщения через Write-Verbose в журнал. Проблема в том, что иногда в этих функциях я печатаю сообщения и/или также возвращаю значение.

Как мы все знаем, все, что возвращает функция, помещается в стандартный вывод. Поэтому в любое время функция возвращает значение, это значение печатается в элементе управления Output Rich Textbox. Я не хочу этого. Кроме того, если я использую многословен, сообщение не печатается в контроле (однако, она печаталась на консоль)

То, что я хочу: только печати сообщения в моем богатом текстовом поле и мой журнал file, без возвращаемых значений функции в потоке (если только они не относятся к самому сообщению).

Примечания: Я снова пишу это приложение из приложения VB.NET, в приложение Powershell студии ... и я заметил, ранее это делается в потоковом STD Output в текстовом поле, используя аналогичный внешний сценарий powershell - за исключением того, что скрипт использовал WRITE-HOST. Для меня это не имеет смысла, поскольку запись-хост даже не предполагается помещать в поток.

Альтернативный подход:

У меня был рабочий пример позволяя работы добавить к самому бревну, а затем с вводного UI Get-Content -tail 1 ... Это будет работать, за исключением того, что некоторые моих сообщений будет напечатано на нескольких строках, и он не потянет все, как ожидалось. Если у кого-то есть способ получить любое количество строк в журнале в любое время, дайте мне знать. Это может быть проще, чем мой нынешний подход.

ответ

0

так что в основном вы хотите использовать powershell в обратном направлении? функции должны возвращать только то значение, которое вы хотите в своем текущем потоке вывода, все, что не должно возвращать значение для потока, должно быть либо записано в переменную, либо отправлено на Out-Null, если вы хотите предоставить информацию о том, что делает команда - это write-verbose для. и Write-Verbose работает так, как предполагалось, так же, как write-host, он не помещается в поток.

Чтобы ответить на ваш вопрос, что вы должны сделать, перепишите свои функции, чтобы они возвращали одно значение (или вообще не имели значения, если это необходимо), для функций, которые нельзя переписать, вы можете подавить их вывод в своем сценарии либо назначая их переменной (если они должны быть использованы позже), либо просто соединяют их с Out-Null. все, что в настоящее время фиксируется в подробном потоке, который должен быть частью вашего вывода, также должен быть перенесен в стандартный поток и написан с Write-Output, потенциально с операторами if, обернутыми вокруг них, если вы хотите, чтобы эти данные были только на определенных прогонах, однако, если вы действительно хотите объединить поток verbose со стандартным потоком, вы можете проверить информацию здесь. Redirect two or more Powershell streams other than output stream to the same file

+0

Out-Null или присвоение результатов функции переменной делает то, что мне нужно. Благодарю. Я пытался приспособиться к ситуации, когда мне понадобилась бы ценность, чтобы быть в потоке, но я полагаю, что я могу работать с ней таким образом. – Zephyrus1898

+0

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