2012-04-21 32 views
0

我正面臨着非常奇怪的行爲,因爲我試圖以編程方式檢測到我的PC上的Java版本。我使用下面的C#代碼:執行「java -version」以編程方式將輸出放在StandardError中而不是StandardOutput

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 -showversion」,它應該同時輸出java版本和幫助信息,我在StandardOutput中獲得幫助信息,版本信息在StandardError中。 這對我沒有意義。

我在2臺Windows 7 x64機器和1臺XP x32上測試了這個。無處不在。這真的很奇怪。

+1

你的實際問題是什麼? – 2012-04-21 09:27:31

+0

@StephenC興奮和分享我猜 – kommradHomer 2012-04-21 09:42:02

回答

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; 
} 
+0

那麼我的理解是,我想要得到的信息應該在StandardOutput而不是StandardError。我不明白爲什麼它在StandardError中。 – harrygg 2012-04-21 17:19:03

1

看起來(被標上印出來即版本),這是一個老問題,Sun公司(Oracle)的從未固定,以避免破壞原有系統喜歡:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4380614。在linux上,java -version> foo將創建一個空文件,而java -version 2> foo將創建一個包含版本的文件。

0

這應該做的伎倆:

java -version 2>&1 | more 

「多」不是必需的,除非你想重定向到文件,例如。

兼容* NIX和Win。

相關問題