在从Java中的ProcessBuilder执行时,Windows REG命令不起作用

我试图用Java创build一个启动registry项,我得到一个非常奇怪的结果。 在一些像XP这样的操作系统上,这个命令完美无瑕。 但是,在Windows 7上,只有在运行编译的jar或类时才会创build密钥,而不是从网页上的小程序运行。 另外在Windows 8上,该命令完全不起作用。 我试过debugging这个,看起来REG命令执行成功。 如果我从命令提示符下手动运行这个命令,它会创build这个键,它的输出和从程序里面运行的时候一样。 下面是代码示例:

public static int regadd(String key, String name, String val) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(new String[]{"REG", "ADD", key, "/v", name, "/d", val, "/f"}); pb.redirectOutput(new File(PathManager.getDirectory(), "log0.txt")); int i = pb.start().waitFor(); Logger.log("ADD: " + i); return i; } 

在log0.txt中打印这个:

操作成功完成。

此外,该程序的“结果”打印

ADD:0

所以在这一点上,我不知道可能是什么问题。 我知道其他冒险的方式来添加到registry,但我想保持我的代码兼容所有的虚拟机发行版。 有没有办法做到这一点或修复退出方法?

我假设你已经安装了多个Java虚拟机(32位,64位,…),并根据你如何执行代码,使用了不同的JavaVM,并得到不同的结果。

例如,在一个applet中,通常最终会在32位的Java虚拟机(因为网络浏览器是32位的,因此虚拟机也必须是32位)。

在这种情况下,我假设reg.exe的32位版本也被执行。 最后写入HKLM\Software所有东西都被重定向到HKLM\SOFTWARE\Wow6432NodeHKCU\Software – > HKCU\Software\Wow6432Node )。

无论如何,我强烈建议你只是为了监测到底是怎么回事。 下载并启动Sysinternals ProcessMonitor,并简单地查看写入注册表的内容。 然后,您可以确定是否创建了要添加的注册表项,或者是否因为任何虚拟化技术而找不到它们。

我开发的插件在注册表中创建密钥。

 import javaQuery.core.Registry; import javaQuery.importClass.javaQueryBundle; public class Demo { public static void main(String[] args) { String response = javaQueryBundle.createRegistry().createKey(Registry.HKEY_CURRENT_USER, "\\jqreg", Registry.key_String_Value, "Software", "javaQueryAPI"); System.out.println(response); } } 

下载库文件 ,如果有任何问题,请告诉我。

要调试这个,你可以尝试执行另一个程序say notepad.exe,来检查它是否在客户端执行。

然后你可以尝试使用“cmd.exe / C reg”而不是“reg”,它将起作用。

请让我知道,如果它的作品。

注册添加文档:

http://technet.microsoft.com/en-us/library/cc742162.aspx

所以我们可以使用http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Runtime.exec(String command)执行该命令并返回一个Process。

 Process proc = Runtime.getRuntime().exec("REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead"); 

现在我们有包含一个经济的方法的流程变量: http ://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream%28%29

 Process.getInputStream(); 

让我们继续我们的代码:

 InputStream in = proc.getInputStream(); for (int i = 0; i < in.available(); i++) { System.out.println("" + in.read()); } 

我想这可能会有所帮助。