繁体   English   中英

Java未执行系统命令

[英]java is not executing system command

在下面的程序中,将名称命名为“ don”,因此该命令将使用所有以don开头的名称(例如donald等)搜索activedirectory。 但是从读者对象分配后,line2变量变为空,并且永远不会进入循环。 我究竟做错了什么? 仅供参考:当我在命令行上输入命令时,该命令有效。

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

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

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

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

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

2)调用waitFor() ,线程将被阻塞,直到进程终止,该进程仅在您“使用”它的InputStream时才终止。 这不会发生,因为waitFor()仍在等待...最好在其他线程中读取和处理InputStream(或在读取InputStream之后调用waitFor )。

3)关闭后的阅读(最后2行)应引发Exception。

读取ErrorStream可能有助于发现一些错误,并且还指示检查waitFor的返回。

编辑:
实际上,该代码应该抛出一些异常。
是报告了异常( printStackTrace )还是将其忽略了?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM