无法从Process.StandardOutput中读取

本文关键字:读取 StandardOutput Process | 更新日期: 2023-09-27 18:05:59

我试图使用进程来检查使用"-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();

无法从Process.StandardOutput中读取

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

bool TryGetJavaHome(
    RegistryView registryView,
    string vendor,
    string installation,
    out string javaHome)
供应商:

  • "JavaSoft"(热点)
  • "JRockit"

安装:

  • "Java Runtime Environment"
  • "Java开发工具包"

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

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

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

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

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

参考:

Antlr4ClassGenerationTaskInternal.cs

经过一些测试,我发现您正在寻找的信息,由于某种原因,可以在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();

如果你删除java.CreateNoWindow = true;,它工作