自定义Powershell主机调用没有控制台窗口的外部程序

时间:2015-05-15 00:04:53

标签: c# visual-studio powershell powershell-v2.0

我正在C#(windows应用程序)中编写一个嵌入式PowerShell主机,如果在管道中调用了外部程序,则控制台窗口会在执行时闪烁。 Ping和netstat就是这方面的示例,如以下代码段

所示
using (PowerShell PowerShellInstance = PowerShell.Create())
    {

        PowerShellInstance.AddScript("Get-Content test.txt; ls; ping www.google.com");

        PowerShellInstance.Invoke();

        # ...more code here to print output etc

    }

在管道中达到ping命令后,将弹出控制台窗口执行命令并返回结果。我想在没有控制台窗口显示的情况下这样做。我搜索并找到了如何通过启动外部命令进程和重定向输出来处理这个问题的示例。

我当然可以这样做,但是我如何测试管道中的命令是否是对外部程序的调用?

我真的希望能够尽可能地处理这个问题;这意味着我不想测试特定的程序(例如ping,netstat,net),如果我不需要的话。本机powershell.exe执行此操作,因此它在某种程度上是可能的。

1 个答案:

答案 0 :(得分:0)

事实证明,这是调用控制台命令的预期行为。在Windows 7及更高版本中,conhost.exe负责处理对控制台程序的调用。在这种情况下,ping和netstat会触发要创建的conhost实例,它会处理请求,返回结果,然后保持打开状态。 conhost.exe启动是导致我看到的控制台闪存的原因。它保持打开的事实是我只看到控制台窗口闪烁一次的原因。一旦conhost连接到调用进程,所有后续控制台命令都由同一个实例处理。

我将此标记为答案,因为应该创建一个新问题来专门解决conhost问题。

源。 Windows Internals第1部分