为什么通过我的 C# 应用程序在 PowerShell 中执行“cmd”命令会冻结它?

app*_*yip 1 c# powershell

语境:

我正在创建一个应用程序,用户可以在其中通过我的 .NET 应用程序执行 PowerShell 命令。

情况

我创建了以下方法:

public static string ExecutePowerShell(string cmd, out string errors)
{
    StringBuilder output = new StringBuilder();

    using (PowerShell PowerShellInstance = PowerShell.Create())
    {
        PowerShellInstance.AddCommand(cmd);

        Collection<PSObject> PSOutput = PowerShellInstance.Invoke();

        foreach (PSObject obj in PSOutput)
        {
            output.AppendLine(obj.ToString());
        }

        errors = string.Join("\n", PowerShellInstance.Streams.Error.ReadAll());
    }

    return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

string errors = String.Empty;

ExecutePowerShell("cmd", out errors);
Run Code Online (Sandbox Code Playgroud)

预期输出:

如果我在 PowerShell 控制台中执行它,我会发现:

截屏

输出:

我的应用程序只是冻结。

重现步骤:

这是重现问题的完整代码:Link to Pastebin for organization

*不要忘记添加对System.Management.Automation程序集的引用(通常在C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0

在上面的代码中,我在两个Console.WriteLine调用中都设置了断点,但都没有到达。显然,屏幕上也没有打印任何内容。

为什么会这样?

Jef*_*lin 5

CMD默认情况下,它是一个交互式程序,将等待用户输入。如果您希望CMD返回,则必须有人EXIT在交互式提示符下键入,或者必须使用/C开关和要执行的命令以批处理模式调用它-/C告诉CMD执行命令,然后返回。

当您更改为时,您的 C# 程序不会挂起CMDIPCONFIG因为IPCONFIG它不是交互式程序并且不会等待用户的输入。

如果您可以更新您的问题以解释您通过调用CMD.