获取Powershell流对象的参考?

时间:2016-10-21 15:33:30

标签: powershell

我有兴趣获得Powershell主机附带的不同流的.NET对象引用(stdin,以及5个输出流调试,信息,错误等)。我有兴趣将这些引用传递给自定义.NET类型它不是cmdlet ......只是希望使用5个输出流和1个输入流的.NET类型。

我花了很多时间用Google搜索和msdning,我似乎无法在读取/写入它们的cmdlet之外找到有关这些流的信息。

如果无法做到这一点,那么链接到一些相关文档就可以得到答案。

更新

感谢目前为止的反馈意见,对于延迟回到这个问题感到抱歉。

@CharlieJoynt这里的想法是我将使用PowerShell作为许多自定义.NET类型的入口点。这些类型也将导入到其他类库和EXE中,因此它们不能是特定于PowerShell的。但是,任何托管类型的东西都会为info / log / error / etc输出提供流(而不是像log4net那样选择特定的日志框架)。

@PetSerAl我不确定XY问题是什么?如果我的更新没有增加你想要的清晰度,你能否澄清(:P)差距是什么?

到目前为止,再次感谢您的反馈,伙计们。

1 个答案:

答案 0 :(得分:1)

我已经能够使用Register-ObjectEvent cmdlet截取写入某些流的数据。

  

<强>注册-ObjectEvent

     

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

     

Register-ObjectEvent cmdlet订阅了以下事件   由本地计算机上的.NET Framework对象生成或在   远程计算机。引发订阅事件时,会将其添加到   会话中的事件队列。要在事件队列中获取事件,请使用   Get-Event cmdlet。

     

您可以使用 Register-ObjectEvent 的参数进行指定   可以帮助您识别事件的事件的属性值   在队列中。您还可以使用Action参数指定操作   在引发订阅事件和转发参数时采取   将远程事件发送到本地会话中的事件队列。

在我的情况下,我创建了一个新的System.Diagnostics.Process对象作为 $ Process ,但在开始该过程之前,我注册了一些事件处理程序,它们作为Jobs存在,例如。

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

...其中$ScriptBlock是预先确定的脚本块,用于处理来自该流的事件。在该脚本块中,可以通过一些内置变量访问事件:

  

操作参数的值可以包含 $ Event ,    $ EventSubscriber $ Sender $ EventArgs $ Args   自动变量,提供有关事件的信息   动作脚本块。

因此,您的ScriptBlock可以使用$EventArgs.Data做一些

免责声明:我使用此方法尝试拦截您提及的所有流,只有OutputDataReceivedErrorDataReceived