我正在创建一个应用程序,用户可以在其中通过我的 .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调用中都设置了断点,但都没有到达。显然,屏幕上也没有打印任何内容。
为什么会这样?
CMD默认情况下,它是一个交互式程序,将等待用户输入。如果您希望CMD返回,则必须有人EXIT在交互式提示符下键入,或者必须使用/C开关和要执行的命令以批处理模式调用它-/C告诉CMD执行命令,然后返回。
当您更改为时,您的 C# 程序不会挂起CMD,IPCONFIG因为IPCONFIG它不是交互式程序并且不会等待用户的输入。
如果您可以更新您的问题以解释您通过调用CMD.
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |