我正在创建一个应用程序,用户可以通过我的.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控制台中执行它,我就会发现这一点:
我的申请冻结了。
以下是重现问题的完整代码:Link to Pastebin for organization
*不要忘记添加对System.Management.Automation
汇编的引用(通常位于C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0
)
在上面的代码中,我在两个Console.WriteLine
个调用中都设置了断点,但没有一个到达。显然,屏幕上也没有任何内容。
为什么会这样?
答案 0 :(得分:4)
CMD
是一个交互式程序,等待用户输入。如果您希望CMD
返回,则必须有人在交互式提示符下键入EXIT
,或者必须使用/C
开关和要执行的命令以批处理模式调用它 - {{ 1}}告诉/C
执行命令,然后返回。
当您将CMD
更改为CMD
时,您的C#程序不会挂起,因为IPCONFIG
不是交互式程序,并且不会等待用户输入。
如果您可以通过调用IPCONFIG
来更新您的问题以解释您实际想要完成的内容,那将会很有帮助。