【问题标题】:Understanding ProcessBuilder了解 ProcessBuilder
【发布时间】:2012-09-05 20:43:42
【问题描述】:

我第二次遇到使用 ProcessBuilder 从系统调用中提取值的问题。

我上次使用调用的时间:

try {
    String[] cmd = new String[5];
    cmd[0] = "reg";
    cmd[1] = "query";
    cmd[2] = key;
    cmd[3] = "/v";
    cmd[4] = name;

    ProcessBuilder pb = new ProcessBuilder(cmd);
    Process process = pb.start();
    StreamReader reader = new StreamReader(process.getInputStream());

    reader.start();
    int exitValue = process.waitFor();
    reader.join();
    if (exitValue != 0) {
        return null;
    }

    String result = reader.getResult();
    int p = result.indexOf(REGSTR_TOKEN);

    if (p == -1) {
        return null;
    }

    return result.substring(p + REGSTR_TOKEN.length()).trim();
} catch (Exception e) {
    return null;
}

从 Windows 注册表中提取值。

但是该值总是返回一个错误,这与我从命令行进行调用时发生的情况不同。可见环境变量不同。

有什么问题?我应该设置任何环境变量吗?

【问题讨论】:

  • 是的,您的代码看起来不错:您应该能够从 Java 阅读器读取“reg”写入标准输出的任何内容。建议:1)从命令提示符运行您的完整命令并确保它是合法的。 2)在调试器下单步执行。检查“结果”;将其与您的命令行输出进行比较。
  • 另一种方法是使用 JNA,它具有用于与 Windows 注册表交互的现有 API。另见stackoverflow.com/questions/62289/…
  • 另外,看看这个:Read-Write Windows Registry Using Java
  • 尝试提供“reg.exe”命令“c:/windows/System32/reg.exe”的完整路径。 ProcessBuilder 不考虑系统路径,也不“猜测”命令扩展名
  • StreamReader 是什么?我是你的命令(使用我自己的启动器代码),它工作正常

标签: java system-calls processbuilder


【解决方案1】:

问题是 Java 运行时发现了错误的reg.exe。当作为命令行执行时,它被执行为\Windows\System32\reg.exe,当在调用我的java类调用\Windows\SysWOW64\reg.exe的进程中运行时。每个reg.exe 指向不同的注册表。那是错误。

代码必须固定:

cmd[0] = "\\Windows\\System32\\reg";

或者:

cmd[0] = "\\Windows\\SysWOW64\\reg";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多