0

当我试图以编程方式检测我的 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() 而不是 proc.StandardOutput.ReadToEnd() 中找到的,就像在任何其他命令中一样(即“java -help”)。

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

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

4

3 回答 3

1

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

于 2012-07-13T12:33:39.983 回答
0

这应该可以解决问题:

java -version 2>&1 | more

“更多”不是必需的,除非您想将其重定向到文件,例如。

适用于 *NIX 和 Win。

于 2012-07-13T12:50:46.987 回答
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;
}
于 2012-04-21T09:36:53.787 回答