在PowerShell运行时,有没有办法以编程方式获取Powershell输入和输出?

时间:2012-05-23 20:16:34

标签: powershell powershell-v2.0 powershell-v1.0

我有一个场景,我需要将powershell命令的命令和输出转发到另一个进程以进行记录和处理。

我希望这个控制台尽可能接近powershell,所以简单地将它托管在另一个控制台程序中是不可取的。

还有开始成绩单,但似乎是缓冲的。我需要逐行获取控制台输出。

如果我有办法在System.Management.Automation.Internal.Host.InternalHostUserInterface调用中的WriteLine期间在powershell主机上设置委托,那么这也是可行的。

这样做最好的方法是什么?

更新(2012年5月29日):我愿意荒谬地做这件事:

FieldInfo internaluiref = host.GetType().GetField("internalUIRef", BindingFlags.NonPublic | BindingFlags.Instance);
object valuecontainer = internaluiref.GetValue(host);
FieldInfo objectrefvalue = valuecontainer.GetType().GetField("_oldValue", BindingFlags.NonPublic | BindingFlags.Instance);
PSHostUserInterface internalHostUserInterface = (PSHostUserInterface)objectrefvalue.GetValue(valuecontainer);
FieldInfo externalUI = internalHostUserInterface.GetType().GetField("externalUI", BindingFlags.NonPublic | BindingFlags.Instance);
PSHostUserInterface externalHostUserInterface = (PSHostUserInterface)externalUI.GetValue(internalHostUserInterface);
HostUserInterfaceProxy indirector = new HostUserInterfaceProxy(externalHostUserInterface);
externalUI.SetValue(internalHostUserInterface, indirector);

这允许我获取分类的输出流信息。

我是如何获得输入的?

1 个答案:

答案 0 :(得分:2)

不要将格式化输出与原始输出混淆。到达主机接口的任何东西都已经被包含在一个字符串中。如果你想从powershell脚本返回实际的对象,请看看我的另一个答案,关于如何从C#执行的脚本块中输出输出:

How to stream the output of a programmatically executed ScriptBlock?