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

时间:2016-12-12 12:40:22

标签: 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();
}

我称之为:

string errors = String.Empty;

ExecutePowerShell("cmd", out errors);

预期输出:

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

Screenshot

输出:

我的申请冻结了。

重现的步骤:

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

*不要忘记添加对System.Management.Automation汇编的引用(通常位于C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0

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

为什么会这样?

1 个答案:

答案 0 :(得分:4)

默认情况下,

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

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

如果您可以通过调用IPCONFIG来更新您的问题以解释您实际想要完成的内容,那将会很有帮助。