Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义Powershell主机调用不带控制台窗口的外部程序_C#_Visual Studio_Powershell_Powershell 2.0 - Fatal编程技术网

C# 自定义Powershell主机调用不带控制台窗口的外部程序

C# 自定义Powershell主机调用不带控制台窗口的外部程序,c#,visual-studio,powershell,powershell-2.0,C#,Visual Studio,Powershell,Powershell 2.0,我正在用C#(windows应用程序)编写一个嵌入式powershell主机,如果管道中有一个调用的外部程序,控制台窗口在执行时会闪烁。Ping和netstat是这方面的示例,如下面的代码段所示 using (PowerShell PowerShellInstance = PowerShell.Create()) { PowerShellInstance.AddScript("Get-Content test.txt; ls; ping www.google.com")

我正在用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会执行此操作,因此它在某种程度上是可能的

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

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


来源。Windows内部构件第1部分

您为什么不想使用内置方法来实现这些功能?比如?不,假设所有常用的windows实用程序都有方法,那就行了。是这样吗?此外,如果用户在嵌入式命令行中输入“netstat”,PowershellInstance会自动调用netstat.exe吗?如果不解析每个命令,然后检查它是否有内置的替代方法,我将如何告诉它。如果可能的话,我希望在我的应用程序中具有与本机powershell.exe相同的功能。使用
Process.Start
,创建脚本并通过命令行运行它,然后将其设置为不创建窗口,怎么样?您可以将标准输入/输出流重定向回应用程序,并使用标准流对象读取它。您有示例吗?我在这里看到过类似showm的示例,但这似乎没有考虑嵌入式powershell主机实现。MSDN有一个很好的示例: