我想在C#中执行命令行,并且仍然让命令行写出它的输入。
目前我正在使用它:
// Now we create a process, assign its ProcessStartInfo and start it
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = new ProcessStartInfo( "Cmd.exe" )
{
WorkingDirectory = executableDirectoryName,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
CreateNoWindow = false,
};
process.Start();
process.StandardInput.WriteLine( arguments.Command );
process.StandardInput.Flush();
process.StandardInput.WriteLine( "exit" );
// Get the output into a string
string result = process.StandardOutput.ReadToEnd();
CommandLineHelper.commandLineOutput = result;
这是因为我正在运行的其中一个进程需要很长时间才能加载...而且在进程结束之前,它不会向命令行输出任何内容。
答案 0 :(得分:2)
我认为你的问题在这里:
string result = process.StandardOutput.ReadToEnd();
从当前位置读取所有字符到流的末尾。
总会尝试阅读所有内容,直到完成后才会返回。
Process.StandardOutput
是StreamReader
,为什么不在循环中尝试ReadLine()
?
答案 1 :(得分:2)
您正在寻找的是异步读取,这是通过the BeginOutputReadline-method方法完成的,您已经按照您的方式激活了同步读取。
简而言之,这就是你需要做的事情:
// use asynchronous method
myProcess.OutputDataReceived += new DataReceivedEventHandler(MyHandler);
// start process
myProcess.Start();
// start the asynchronous read
myProcess.BeginOutputReadLine();
并定义myHandler
:
static void MyHandler(object sendingProcess, DataReceivedEventArgs output)
{
if (!String.IsNullOrEmpty(output.Data))
{
Console.WriteLine(output.Data); // or whatever
}
}
答案 2 :(得分:0)
如果您只想阅读流程中的输出,而不是等待它完成,请使用ReadLine
代替ReadToEnd
while (!process.StandardOutput.EndOfStream)
{
Console.WriteLine(process.StandardOutput.ReadLine());
}