C# 执行;java版本;以编程方式将输出放置在StandardError中,而不是StandardOutput中

C# 执行;java版本;以编程方式将输出放置在StandardError中,而不是StandardOutput中,c#,java,version,C#,Java,Version,当我试图以编程方式检测PC上的java版本时,我面临着非常奇怪的行为。我使用以下C代码: 这显示了正确的信息,但结果是在proc.StandardError.ReadToEnd()中找到的,而不是在任何其他命令(即“java-help”)中找到的proc.StandardOutput.ReadToEnd() 更奇怪的是,如果我运行“java-showversion”,它应该同时输出java版本和帮助信息,我会在StandardOutput中获得帮助信息,而版本信息在StandardError中。

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

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

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


我在2台Windows7x64机器和1台XPX32上测试了这个。到处都一样。真奇怪

看起来这是一个老问题,sun(oracle)从未解决过,以避免破坏遗留系统:这是一个老问题(即在标准输出上打印版本)。在linux上,java-version>foo将创建一个空文件,而java-version 2>foo将创建一个包含该版本的文件。

这应该可以做到:

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;
}
java -version 2>&1 | more
“more”不是必需的,除非您想将其重定向到文件


对*NIX和Win都有效。

你真正的问题是什么?@StephenC兴奋地分享我猜我的理解是,我试图获取的信息应该在StandardOutput中,而不是StandardError中。我不明白为什么它是标准错误。
java -version 2>&1 | more