以前曾问过关于STDOUT
(STandarOUTput
)的类似问题。但就我而言,仍然没有例外,输出结果是一个空字符串。
使用以下代码,我能够成功执行EXE。 Exe在命令窗口上返回一些输出,我也可以看到。现在,我想以字符串形式读取该输出。在下面的代码中,strOutput
是一个空字符串(即使我可以在命令窗口中看到一些输出)。
这是我的代码:
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
try
{
myProcess.StartInfo.Arguments = "";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = @"D:\exeFilePath\exedrivermanager.exe";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.Start();
string strOutput = myProcess.StandardOutput.ReadToEnd(); //THIS RETURNS AN EMPTY STRING.
Console.WriteLine(Environment.NewLine + Environment.NewLine + "Output: " + strOutput);
//Wait for process to finish
myProcess.WaitForExit();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
编辑:
我意识到即使使用命令行也无法将输出写入文件。似乎被调用程序永远不会完全终止。调用的程序离开命令行,如下面的屏幕截图所示。
答案 0 :(得分:1)
我认为最好的做法是将exec输出写入外部文本文件,然后使用常规方法从该文件读取文本文件。
答案 1 :(得分:0)
我发现订阅事件更加可靠。正如Adriano所说,您可能还应该重定向错误流。这是一个应该有所帮助的代码段:
process.EnableRaisingEvents = true;
process.StartInfo.RedirectStandardError = true;
process.OutputDataReceived += process_Output;
process.ErrorDataReceived += process_Error;
void process_Output(object sender, DataReceivedEventArgs e)
{
//e.Data would contain a line
var outputLine = e.Data;
}
void process_Error(object sender, DataReceivedEventArgs e)
{
var errorLine = e.Data;
}
答案 2 :(得分:0)
要了解问题所在,您也可以尝试阅读ErrorStream。例如,MongoDB restore util将所有控制台信息写入ErrorStream而不是OutputStream。我建议您尝试使用事件监听器:
val fruits = "fruits: apple, orange, banana"
fruits match {
case regex(fruits) => // where `fruits` is `List[String] = List(apple, orgran, banana)`
}