StandardOutput在C#中返回空字符串

时间:2019-02-20 12:45:55

标签: c# windows command-prompt

以前曾问过关于STDOUTSTandarOUTput)的类似问题。但就我而言,仍然没有例外,输出结果是一个空字符串。

使用以下代码,我能够成功执行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);
}

编辑:

我意识到即使使用命令行也无法将输出写入文件。似乎被调用程序永远不会完全终止。调用的程序离开命令行,如下面的屏幕截图所示。

enter image description here

3 个答案:

答案 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)`
}