自定义 Powershell 主机在没有控制台的情况下调用外部程序 window

Custom Powershell Host Invoke external program without console window

我正在用 C# 编写一个嵌入式 powershell 主机(windows 应用程序),如果在管道中调用了一个外部程序,控制台 window 会在执行时闪烁。 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 命令,控制台 window 将弹出执行命令和 return 结果。我想在不显示控制台 window 的情况下执行此操作。我已经搜索并找到了如何通过启动外部命令进程和重定向输出来处理此问题的示例。

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

如果可能的话,我真的很希望能够通用地处理这个问题;这意味着如果不需要,我不想测试特定程序(例如 ping、netstat、net)。本机 powershell.exe 这样做,所以它在某种程度上是可能的。

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

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

来源。 Windows 内幕第 1 部分