如何使用C#与cmd.exe进行交互?

时间:2015-12-27 15:02:51

标签: c# windows cmd

我想使用C#调用cmd.exe。 我想在C#中编写多个cmd命令。

最重要的关键是: 我想与cmd窗口进行交互。根据上一个命令输出键入下一个命令。

但是现在我已经尝试过,它可以输入多个命令,但只输入一个输出或一个输出Err。

我想实现一个命令一个输出,而下一个命令也是同一个cmd窗口而不是一个新的cmd窗口?

如何解决这个问题。 示例代码就像这样

string[] message = new string[2];

ProcessStartInfo info = new ProcessStartInfo();

info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;

info.UseShellExecute = false;
info.FileName = "cmd.exe";
info.CreateNoWindow = true;

Process proc = new Process();
proc.StartInfo = info;
proc.Start();

using (StreamWriter writer = proc.StandardInput)
{
    if (writer.BaseStream.CanWrite)
    {
        foreach (string q in command)
        {
            writer.WriteLine(q);
        }
        writer.WriteLine("exit");
    }
}

message[0] = proc.StandardError.ReadToEnd();

if (output)
{
    message[1] = proc.StandardOutput.ReadToEnd();
}

return message;

1 个答案:

答案 0 :(得分:2)

问题是cmd是一个cli应用程序,所以proc.StandardOutput.ReadToEnd()会阻塞你的线程,你不能简单地把ReadToEnd()放在你的循环中(执行多个命令)。

在我的演示中,我启动一个新线程来处理输出。因此我不会阻止我的命令输入。

  var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardInput = true,
                CreateNoWindow = true
            }
        };
        proc.Start();
        StringBuilder sb = new StringBuilder();
        var outStream = proc.StandardOutput;
        var inStream = proc.StandardInput;
        inStream.WriteLine("mkdir test");
        Task.Run(() =>
        {
            while (true)
            {
                Console.WriteLine(outStream.ReadLine());
            }
        });
        Console.WriteLine("dir");
        inStream.WriteLine("dir");

        Console.WriteLine("mkdir test");
        inStream.WriteLine("mkdir test");

        Console.WriteLine("dir");
        inStream.WriteLine("dir");
        Console.ReadLine();

    }

原谅我可怜的英语,