我正在尝试使用 Java 创建一个启动注册表项,但我得到了一个非常奇怪的结果。在某些操作系统(如 XP)上,该命令可以完美运行。但是,在 Windows 7 上,如果您运行编译的 jar 或类,而不是从网页上的小程序,它只会创建 key 。此外,在 Windows 8 上,该命令根本不起作用。我试过调试它,似乎 REG 命令执行成功。如果我从命令提示符手动运行命令,它会创建 key ,输出与从程序内部运行时相同。下面是代码示例:
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 中打印如下:
The operation completed successfully.
此外,程序打印“结果”
ADD: 0
所以在这一点上,我不知道可能是什么问题。我知道添加到注册表的其他冒险方法,但我想让我的代码与所有 VM 发行版兼容。有没有办法完成这个或修复现有方法?
最佳答案
我假设您安装了多个 Java VM(32 位、64 位...),并且根据您执行代码的方式,使用不同的 JavaVM 会产生不同的结果。
例如,在 applet 中,您通常会以 32 位 Java VM 结束(因为网络浏览器是 32 位的,因此 VM 也必须是 32 位的)。
在这种情况下,我假设 reg.exe 的 32 位版本也被执行。最后,写入 HKLM\Software
的所有内容都被重定向到 HKLM\SOFTWARE\Wow6432Node
(对于 HKCU\Software
-> HKCU\Software\Wow6432Node
).
无论如何,我强烈建议您只监视实际发生的事情。下载并启动 Sysinternals ProcessMonitor并简单地查找写入注册表的内容。然后您可以确定是否创建了您要添加的注册表项,或者您是否因为任何虚拟化技术而根本找不到它们。
关于java - 从 Java 中的 ProcessBuilder 执行时,Windows REG 命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20272677/