我有兴趣获得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)差距是什么?
到目前为止,再次感谢您的反馈,伙计们。
答案 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
和做一些。
免责声明:我不使用此方法尝试拦截您提及的所有流,只有OutputDataReceived
和ErrorDataReceived
。