【问题标题】:java is not executing system commandjava没有执行系统命令
【发布时间】:2010-08-23 11:42:00
【问题描述】:

在以下程序中,我将名称命名为“don”,因此该命令将搜索 activedirectory 所有以 don 开头的名称(如 donald 等)。但是 line2 变量在读取器对象赋值后变为 null 并且它永远不会进入循环。我究竟做错了什么?仅供参考:当我在命令行上给出命令时,该命令有效。

try {
    Process p = Runtime.getRuntime().exec(
        "dsquery user -name " + name + "* -limit 200|dsget user -samid -display");
    p.waitFor();
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(p.getInputStream()));
    String line2 = reader.readLine();
    HashMap<String,String> hmap = new HashMap<String,String>();
    while (line2 != null) {
        line2 = line2.trim();
        if (line2.startsWith("dsget")||line2.startsWith("samid")) {
            continue;
        }
        String[] arr = line2.split(" ",1);
        hmap.put(arr[0].toLowerCase(),arr[1].toLowerCase());
        line2 = reader.readLine();
    }
    reader.close();
    line2 = reader.readLine();
}

【问题讨论】:

  • 你不应该这样做 p.waitFor(); ,在进程退出后尝试读取输出是没有意义的。删除该行。

标签: java process active-directory


【解决方案1】:

如果我没记错的话,管道(或重定向)需要使用 cmd.exe 启动程序。 类似的东西:

Process p = Runtime.getRuntime().exec("cmd /c dsquery user -name " + name + "* -limit 200|dsget user -samid -display");

【讨论】:

  • 您可以使用错误流来确认它没有找到命令
  • 你是对的。管道是 cmd/shell 的一项功能,仅在该上下文中可用。
  • 我现在试试这个方法。谢谢:-)
【解决方案2】:

我至少可以看到一些可能的问题:

1) 正如PhiLho 所写:管道和重定向由shell(sh、bash、...或Windows 上的cmd.exe)完成。您必须在 Java 代码中处理它或在 shell 中运行您的命令。

2) 在调用waitFor() 之后,线程被阻塞直到进程终止,只有当你“消费”它是 InputStream 时进程才会终止。这不会发生,因为waitFor() 仍在等待...最好在另一个线程中读取和处理 InputStream(或在读取 InputStream 后调用 waitFor)。

3) 关闭后读取(最后 2 行)应该抛出异常。

读取ErrorStream可以帮助发现一些错误,并且还指出了检查waitFor的返回。

编辑:
实际上,该代码应该会引发一些异常。
异常被报告 (printStackTrace) 还是被忽略?

【讨论】:

  • 实际上根本没有抛出异常(这令人惊讶!)。它只是出现在 line 字符串 line2 = reader.getline() 和 line2 变为 null ......跳过循环给我任何回报。不过,我将不得不尝试 cmd.exe 方法。
  • 小修正...我正在调试(逐行)程序直到 reader2.close()...并没有真正运行到最后。如果我运行它,我会得到异常,因为我关闭了流并再次阅读:-)。
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2021-09-07
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多