我想使用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;
答案 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();
}
原谅我可怜的英语,