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;

これは正しい情報を表示しますが、結果は他のコマンド (つまり、「java -help」) の場合の proc.StandardOutput.ReadToEnd() ではなく、proc.StandardError.ReadToEnd() にあります。

さらに奇妙なことに、「java -showversion」を実行すると、Java のバージョンとヘルプ情報の両方を出力する必要があり、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

たとえば、ファイルにリダイレクトする場合を除き、「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 に答える