#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 и посмотреть, смогу ли я выполнить задачу с его помощью. Если да, я опубликую то, что я сделал.