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

 elsister789_4592 发布于 2023-02-13 23:23

我正在尝试使用Java来创建一个启动注册表项,我得到一个非常奇怪的结果.在某些操作系统(如XP)上,命令可以完美运行.但是,在Windows 7上,它只会在运行已编译的jar或类时创建密钥,而不是从网页上的applet运行.此外,在Windows 8上,该命令根本不起作用.我已经尝试过调试它,似乎REG命令正在成功执行.如果我从命令提示符手动运行该命令,它将创建键,其输出与从程序内部运行时的输出相同.下面是代码示例:

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中打印:

操作成功完成.

另外,程序的"结果"打印出来

地址:0

所以在这一点上,我不知道可能是什么问题.我知道添加到注册表的其他有趣的方法,但我想保持我的代码与所有VM分发兼容.有没有办法完成这个或修复现有的方法?

2 个回答
  • 我假设您安装了多个Java VM(32位,64位,...),并且根据您执行代码的方式,使用不同的JavaVM,结果不同.

    例如,在applet中你通常最终会进入32位Java VM(因为Web浏览器是32位,因此VM也必须是32位).

    在这种情况下,我假设也执行了reg.exe的32位versuon.最后写入的所有内容都HKLM\Software被重定向到HKLM\SOFTWARE\Wow6432Node(相同的HKCU\Software- > HKCU\Software\Wow6432Node).

    无论如何,我强烈建议您只是为了监控实际情况.下载并启动Sysinternals ProcessMonitor,只需查找写入注册表的内容即可.然后,您可以确定是否创建了要添加的注册表项,或者是否由于任何虚拟化技术而无法找到它们.

    2023-02-13 23:40 回答
  • 我开发了插件来创建注册表中的密钥.

    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);
        }
    }
    

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

    2023-02-13 23:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有