无法从Process.StandardOutput读取

时间:2013-03-25 15:15:56

标签: c# process

我正在尝试使用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();

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

3 个答案:

答案 0 :(得分:1)

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

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

供应商:

  • “JavaSoft”(HotSpot)
  • “的JRockit”

安装:

  • “Java Runtime Environment”
  • “Java Development Kit”

如果您查看该方法的代码,您将找到获取当前版本的以下行。

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

答案 1 :(得分:0)

如果您删除java.CreateNoWindow = true;,则可以。

答案 2 :(得分: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();