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

标签 java windows registry processbuilder

我正在尝试使用 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/

相关文章:

powershell - 以字符串形式获取注册表值的方法比 (Get-ItemProperty $key $valueName)._VALUENAME_?

c++ - RegSetValueEx 只显示写入第一个字符

java - 在 OpenJDK 上运行时加载 java 代理?

windows - Visual Studio 2010 中的编程数据断点

c# - C#检查文件的最后修改日期

windows - "-k"中的 "svchost -k"标志是什么意思?

registry - UninstallString 注册表项的所有可能位置在哪里?

Java/cglib 只调用 super 时忽略方法?

Java Selenium,如何从链接 WebElement 获取 linkText( anchor )

java - 由于 '[3D000] No database selected',Intellij Idea JPA 控制台无法运行