我正面临非常奇怪的行为,因为我试图以编程方式检测我的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上进行了测试。到处都是一样的。这真的很奇怪。
答案 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。