我正在尝试使用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();
这可能是一件小而简单的事情,但我看不到它。
答案 0 :(得分:1)
您也可以从注册表中读取当前安装的Java版本。以下文件包含方法TryGetJavaHome
,该方法支持特定供应商/安装组合的32位和64位虚拟机。
bool TryGetJavaHome(
RegistryView registryView,
string vendor,
string installation,
out string javaHome)
供应商:
安装:
如果您查看该方法的代码,您将找到获取当前版本的以下行。
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”。
答案 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();