C# 无法从Process.StandardOutput中读取

C# 无法从Process.StandardOutput中读取,c#,process,C#,Process,我试图使用一个命令行参数来检查使用“-version”安装的Java版本。然而,当我试图从java应用程序读取命令行输出时,我得到一个空值 我的代码相当简单: Process java = new Process(); java.StartInfo.RedirectStandardOutput = true; java.StartInfo.CreateNoWindow = true; java.StartInfo.UseShellExecute = false; java.StartInfo.F

我试图使用一个命令行参数来检查使用“-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();
processjava=newprocess();
java.StartInfo.RedirectStandardOutput=true;
java.StartInfo.CreateNoWindow=true;
java.StartInfo.UseShellExecute=false;
java.StartInfo.FileName=“java”;
java.StartInfo.Arguments=“-version”;
java.Start();
//版本为空
字符串版本=java.StandardOutput.ReadLine();
//可能有更好的方法提取这些数据,但是
//我想在过那座桥之前把它修好。
string versionNumber=version.Substring(16,1);
hasJava=int.Parse(versionNumber)<7;
java.Close();

它可能很小很简单,但我看不到它。

如果您删除
java.CreateNoWindow=true,它可以工作。

您也可以从注册表中读取当前安装的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");
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();
对于某些安装,不存在系列版本,但对于标准运行时安装,我看到值“1.6.0_38”和“1.7.0_13”


参考:

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

尝试以下方法

object familyVersion6 = javaKey.GetValue("Java6FamilyVersion");
object familyVersion7 = javaKey.GetValue("Java7FamilyVersion");
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();

结果是空的吗?或者它是空的?@SamIam null,如果它是空的,我会假设java只是写了一个空的like,然后尝试另一个ReadLine(),我发现一些东西可以在我的机器上工作,但对我来说仍然不工作。非常奇怪的是,它对您有效。甚至在在线编译器中也有效:这个编译器甚至可以调用java,这给我带来了另一个想法,请尝试重定向和读取StandardError!也许java编写了stderr而不是stdoutGood idea,出于某种原因,当我调试错误时,我找到了输出。很奇怪,但我可以用它。非常奇怪,我刚刚发现,当你在打字的时候(见我对Dmitry Ledentsov回答的赞扬)