如何使用C#与cmd.exe交互?
我想用C#调用cmd.exe。 我想用C#编写多个cmd命令 最重要的关键是: 我想与cmd窗口交互。下一个命令是根据上一个命令输出键入的。 但现在我试过了,它可以输入多个命令,但只能输入一个输出或一个输出程序 我想实现一个命令一个输出,下一个命令也是同一个cmd窗口,而不是一个新的cmd窗口 如何解决这个问题。 示例代码如下如何使用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
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
。看看这个例子。企鹅,你属于哪个属?帝国?企鹅,你属于哪个属?帝国?