[英]How to interact with cmd.exe using C#?
我想使用C#调用cmd.exe。 我想用C#编写多个cmd命令。
最重要的键是: 我想与cmd窗口进行交互。下一个命令是根据最后一个命令输出键入的。
但是现在我尝试了,它可以输入多个命令,但只能输入一个输出或一个outputErr。
我想实现一个命令一个输出,而下一个命令也是相同的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();
}
原谅我可怜的英语,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.