Получить ссылки на потоковые объекты Powershell?

#powershell

#powershell

Вопрос:

Я заинтересован в получении .Ссылки на СЕТЕВЫЕ объекты для различных потоков, поставляемых с хостом Powershell (stdin, плюс 5 выходных потоков debug, info, error и т.д.) Я заинтересован в передаче их на пользовательский интерфейс .СЕТЕВЫЕ типы, которые не будут командлетами… просто .СЕТЕВЫЕ типы, которые ожидают использовать 5 выходных потоков и 1 входной поток.

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

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

Обновить

Спасибо за отзыв на данный момент и извините за задержку с возвращением к этому вопросу.

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

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

Еще раз спасибо за обратную связь, ребята.

Комментарии:

1. Для меня это похоже на вопрос XY. Чего вы на самом деле пытаетесь достичь? И почему вы думаете, что для этого вам нужны ссылки на потоковые объекты PowerShell?

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

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

Ответ №1:

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

Регистрация-ObjectEvent

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

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

Вы можете использовать параметры Register-ObjectEvent, чтобы указать значения свойств событий, которые могут помочь вам идентифицировать событие в очереди. Вы также можете использовать параметр Action для указания действий, которые необходимо предпринять при возникновении подписанного события, и параметр Forward для отправки удаленных событий в очередь событий в локальном сеансе.

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

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

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

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

Таким образом, ваш ScriptBlock мог бы взять $EventArgs.Data и что-то с этим сделать.

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

Комментарии:

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