0

我正在尝试使用Process来检查使用“-version”命令行参数安装的 Java 版本。但是,当我尝试从 java 应用程序读取命令行输出时,我得到一个空值。

我的代码相当简单:

Process java = new Process();
java.StartInfo.RedirectStandardOutput = true;
java.StartInfo.CreateNoWindow = true;
java.StartInfo.UseShellExecute = false;
java.StartInfo.FileName = "java";
java.StartInfo.Arguments = "-version";
java.Start();

// version comes out null
string version = java.StandardOutput.ReadLine();

// There are probably better ways to extract this data but
// I want to get it working before I cross that bridge.
string versionNumber = version.Substring(16, 1);
hasJava = int.Parse(versionNumber) < 7;

java.Close();

这可能是一件小而容易的事情,但我看不到它。

4

3 回答 3

1

您也可以从注册表中读取当前安装的 Java 版本。以下文件包含方法TryGetJavaHome,它支持特定供应商/安装组合的 32 位和 64 位虚拟机。

bool TryGetJavaHome(
    RegistryView registryView,
    string vendor,
    string installation,
    out string javaHome)

供应商:

  • “JavaSoft”(热点)
  • “JRockit”

安装:

  • “Java运行时环境”
  • “Java 开发工具包”

如果您查看该方法的代码,您会发现获取当前版本的以下行。

object currentVersion = javaKey.GetValue("CurrentVersion");

这将返回一个类似“1.7”或“1.6”的值。如果想要更完整的版本号,一些安装提供以下内容。

object familyVersion6 = javaKey.GetValue("Java6FamilyVersion");
object familyVersion7 = javaKey.GetValue("Java7FamilyVersion");

对于某些安装,家庭版本不存在,但对于标准运行时安装,我看到值“1.6.0_38”和“1.7.0_13”。

参考: Antlr4ClassGenerationTaskInternal.cs

于 2013-03-25T15:36:30.430 回答
0

经过一些测试,我发现您正在寻找的信息,出于某种原因,可以在standardError流中找到。

尝试以下。

Process java = new Process();
java.StartInfo.RedirectStandardError = true;
java.StartInfo.CreateNoWindow = true;
java.StartInfo.UseShellExecute = false;
java.StartInfo.FileName = "java";
java.StartInfo.Arguments = "-version";
java.Start();

// version comes out null
string version = java.StandardError.ReadLine();

// There are probably better ways to extract this data but
// I want to get it working before I cross that bridge.
string versionNumber = version.Substring(16, 1);

java.Close();
于 2013-03-25T15:40:21.027 回答
0

如果你删除java.CreateNoWindow = true;,它的工作原理。

于 2013-03-25T15:25:11.293 回答