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

如何使用C#与cmd.exe交互?,c#,windows,cmd,C#,Windows,Cmd,我想用C#调用cmd.exe。 我想用C#编写多个cmd命令 最重要的关键是: 我想与cmd窗口交互。下一个命令是根据上一个命令输出键入的。 但现在我试过了,它可以输入多个命令,但只能输入一个输出或一个输出程序 我想实现一个命令一个输出,下一个命令也是同一个cmd窗口,而不是一个新的cmd窗口 如何解决这个问题。 示例代码如下 string[] message = new string[2]; ProcessStartInfo info = new ProcessStartInfo(); i

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

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

但现在我试过了,它可以输入多个命令,但只能输入一个输出或一个输出程序

我想实现一个命令一个输出,下一个命令也是同一个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;

问题是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();

    }

请原谅我的英语不好,

问题是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();

    }

原谅我的英语不好,

调用
proc.StandardOutput.ReadToEnd()不给你所有的输出?您的问题是您不知道如何分割它吗?
proc.StandardOutput.ReadToEnd()
可以输出所有命令输出,但问题可能是,下一个命令将根据前一个命令输出键入。例如,如果前一个命令输出“您多大了”,我将输入一个数字,如果前一个命令输出“什么;你叫什么名字“,我会输入我的名字……我必须承认,这个问题让我困惑。我不明白我想与cmd窗口交互什么。下一个命令是根据上一个命令输出键入的。真的很重要。另外,这是一个Windows应用程序,您还需要一个控制台窗口吗?为什么不使用
alloconsole
。例如,请参见此。是否调用
proc.StandardOutput.ReadToEnd()不给你所有的输出?您的问题是您不知道如何分割它吗?
proc.StandardOutput.ReadToEnd()
可以输出所有命令输出,但问题可能是,下一个命令将根据前一个命令输出键入。例如,如果前一个命令输出“您多大了”,我将输入一个数字,如果前一个命令输出“什么;你叫什么名字“,我会输入我的名字……我必须承认,这个问题让我困惑。我不明白我想与cmd窗口交互什么。下一个命令是根据上一个命令输出键入的。真的很重要。另外,这是一个Windows应用程序,您还需要一个控制台窗口吗?为什么不使用
alloconsole
。看看这个例子。企鹅,你属于哪个属?帝国?企鹅,你属于哪个属?帝国?