以编程方式执行“java -version”将输出放在StandardError而不是StandardOutput中

时间:2012-04-21 09:23:03

标签: c# java version

我正面临非常奇怪的行为,因为我试图以编程方式检测我的PC上的java版本。我使用以下C#代码:

ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c java -version");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.RedirectStandardError = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();
// Get the output into a string
output = proc.StandardOutput.ReadToEnd();
   if (output == "")
   output = proc.StandardError.ReadToEnd();
return output;

这会显示正确的信息,但结果可以在proc.StandardError.ReadToEnd()中找到,而不是像任何其他命令(即'java -help')中的proc.StandardOutput.ReadToEnd()。

更奇怪的是,如果我运行“java -showversion”,它应输出java版本然后输出帮助信息,我会在StandardOutput中获得帮助信息,版本信息在StandardError中。 这对我来说没有意义。

我在2台Windows 7 x64机器和1台XP x32上进行了测试。到处都是一样的。这真的很奇怪。

3 个答案:

答案 0 :(得分:1)

看起来喜欢这个(即标准打印的版本)是sun(oracle)从未修复的旧问题,以避免破坏遗留系统:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4380614。在linux上, java -version> foo 将创建一个空文件,而 java -version 2> foo 将创建一个包含该版本的文件。

答案 1 :(得分:0)

ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c java -version");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.RedirectStandardError = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.EnableRaisingEvents = true;
// create event and wait for data receive
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived);
proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit();

static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    string s = e.Data;
}

static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string s = e.Data;
}

答案 2 :(得分:0)

这应该可以解决问题:

java -version 2>&1 | more

除非您想将其重定向到文件,否则不需要“更多”。

适用于* NIX和Win。