C#执行,等待,读取命令的输出

时间:2019-12-03 18:30:57

标签: c# .net cmd

我正在尝试使用C#在Windows pc上读取所有系统信息。这是我的代码:

 public static string GetSystemInfo()
        {
            String command = "systeminfo";
            ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe");
            cmdsi.Arguments = command;
            Process cmd = Process.Start(cmdsi);
            cmd.WaitForExit();
            return cmd.StandardOutput.ReadToEnd();
        }

但是它只是打开一个控制台,不执行systeminfo命令。

该如何解决?

2 个答案:

答案 0 :(得分:3)

以下代码段有效

public static string GetSystemInfo()
{
    String command = "/c systeminfo";
    ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe");
    cmdsi.Arguments = command;
    cmdsi.RedirectStandardOutput = true;
    cmdsi.UseShellExecute = false;
    Process cmd = Process.Start(cmdsi);
    var output = cmd.StandardOutput.ReadToEnd();

    cmd.WaitForExit();

    return output;
}

您应将RedirectStandardOutput设置为true并在调用WaitForExit之前读取输出,否则根据MSDN

会出现死锁。
  

该示例通过调用避免死锁情况   p.WaitForExit之前的p.StandardOutput.ReadToEnd。僵局   如果父进程在之前调用p.WaitForExit可能会导致   p.StandardOutput.ReadToEnd,子进程将足够的文本写入   填充重定向的流。父进程将无限期等待   让子进程退出。

/c意味着执行后终止cmd

答案 1 :(得分:1)

您需要在命令前加"/c"

String command = "/c systeminfo";

/c表示您要执行以下命令

更新

ProcessStartInfo.RedirectStandardOutput必须设置为true,如Pavel的回答所述。