2016-10-21 2 views
0

Я заинтересован в получении ссылок на объекты .NET для разных потоков, которые поставляются с хостом Powershell (stdin, плюс 5 отладочных потоков вывода, информация, ошибка и т. Д.). Я заинтересован в передаче этих данных в пользовательские типы .NET, которые НЕ будут командлетами ... просто типами .NET, которые ожидают использования 5 выходных потоков и 1 входного потока.Получить ссылки на объекты Stream Powershell?

Я потратил много времени на поиск в Google и MSN, и я просто не могу найти информацию об этих потоках за пределами командлетов, которые их читают/пишут.

Если это невозможно, ссылка на некоторую связанную документацию даст ответ.

Update

Спасибо за обратную связь до сих пор, и извините за задержку в принятии его обратно на этот вопрос.

@CharlieJoynt Идея здесь заключается в том, что я буду использовать PowerShell в качестве точки входа для ряда пользовательских типов .NET. Это типы, которые также будут импортированы в другие библиотеки классов и EXE, поэтому они не могут быть специфичными для PowerShell. Тем не менее, все, что размещает эти типы, предоставляет потоки для вывода info/log/error/etc (вместо выбора конкретной структуры ведения журнала, такой как log4net).

@PetSerAl Я не уверен, что такое вопрос XY? Если мое обновление не добавляет ясности, которую вы ищете, можете ли вы пояснить (: P), в чем состоит пробел?

Еще раз спасибо за отзыв, ребята.

+0

Похож на вопрос XY для меня. Чего вы действительно пытаетесь достичь? И почему, по-вашему, вам нужны ссылки на объекты PowerShell Stream для этого? – PetSerAl

+0

Да, небольшая ясность здесь поможет в том, что выглядит довольно интересным вопросом. Например, вы пытаетесь решить эту проблему * в * PowerShell (например, записывать различные потоки в разные файлы журналов) или в окружение * вокруг * PowerShell (например, при написании пользовательского хоста). –

+0

@Paul, вопрос XY здесь обсуждается на сайте «meta» для этого форума: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

ответ

1

Я смог перехватить данные, записанные в определенные потоки, с помощью командлета Register-ObjectEvent.

Регистр-ObjectEvent

https://technet.microsoft.com/en-us/library/hh849929.aspx

Регистр-ObjectEvent Командлет подписывается на события, которые генерируемый .NET Framework объектов на локальном компьютере или на удаленном компьютере . Когда подписывается событие, оно добавляется к очереди событий в вашем сеансе. Чтобы получить события в очереди событий, используйте командлет Get-Event.

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

В моем случае я создал новый System.Diagnostics.Process объект, как $ Процесс, но перед началом этого процесса я зарегистрировал несколько обработчиков событий, который существует как Джобс, например,

$StdOutJob = Register-Object-Event -InputObject $Process ` 
    -EventName OutputDataReceived -Action $ScriptBlock 

... где $ScriptBlock это предопределено блок-скрипт, который обрабатывает события, поступающие из этого потока.В рамках этого блока сценария, события доступны через несколько встроенных переменные:

Значение действий параметра может включать в себя $ Event, $ EventSubscriber, $ Sender, $ EventArgs и $ Args автоматические переменные, которые предоставляют информацию о событии блок сценария Action.

Так что ваш ScriptBlock может принять $EventArgs.Data и сделать что-то с ним.

Отказ от ответственности: У меня есть не использовал этот метод, чтобы попытаться перехватить все потоки вы упоминаете, только OutputDataReceived и ErrorDataReceived.

+0

Когда у меня есть проблемы Я собираюсь заглянуть в этот бизнес Register-ObjectEvent и посмотреть, смогу ли я с ним справиться. Если так, я опубликую то, что я сделал. –

Смежные вопросы