java没有执行系统命令

时间:2010-08-23 11:42:01

标签: java process active-directory

在下面的程序中,我将名称命名为“don”,因此该命令将搜索activedirectory 所有名字都以唐开头(如唐纳德等)。但是,从reader对象赋值后,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();
}

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

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

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

读取ErrorStream可以帮助查找一些错误,并且还会指示检查waitFor的返回值。

编辑:
实际上应该有一些异常被该代码抛出。
是否报告了例外(printStackTrace)或忽略了?