1

我在让 .getruntime.exec() 正常工作时遇到了一些问题。这是处理该部分的代码:

while (line != null)
{
  String name = line;
  String commandFull = commandFirst + name + commandLast;

  String[] fullCommand = new String[] {commandFirst, name, commandLast};
  for(int i=0;i<3;i++)
  {
    System.out.print(fullCommand[i]);
  }
  Runtime runner = Runtime.getRuntime();
  Process p = runner.exec(fullCommand);

  outFile.println(fullCommand);

  line = inFile.readLine();
}

它打印出它应该看起来的命令。当我在这里运行程序时是输出:

adfind -b dc=stuff,dc=com -f "cn=user" |find "displayName" >> fullList.txt
Exception in thread "main" java.lang.IllegalArgumentException
        at java.lang.ProcessImpl.<init>(Unknown Source)
        at java.lang.ProcessImpl.start(Unknown Source)
        at java.lang.ProcessBuilder.start(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at lookup.main(lookup.java:41)
4

5 回答 5

5

您正在尝试在没有 shell 的情况下执行 shell 命令。

也就是说,您正在尝试执行 shell 将解释的某些内容(特别是 pipe'|'和 append '>>')。为了解决这个问题,让 Java 执行一个 shell 实例并将整个命令传递给 shell。这将如何工作取决于平台。

例如在 Linux 中:

String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

或在 Windows 中:

String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};
于 2009-07-13T20:39:37.837 回答
2

重定向和管道不起作用 - 它们不是命令的一部分,但当您从例如 cmd.exe 窗口运行此行时,它们依赖于要评估的底层 shell。

您将需要使用从 exec() 方法获得的 Process 对象的输入和输出流。

如果您主要关心的是查询 Active Directory,而不是使用手头的特定查询工具,那么您应该考虑使用全 Java 解决方案。有几种方法可以访问 LDAP 目录(Active Directory 也是如此),例如这里:

http://developer.novell.com/wiki/index.php/Jldap

我自己还没有使用过它,但是它似乎并没有被放弃,因为有 2008 年的版本。

于 2009-07-13T20:40:25.777 回答
0

我猜“追加”(>>)和“管道”(|)是不允许的。

您可以通过在数组中给每个项目一个位置来尝试它:

String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }

看看会发生什么。

于 2009-07-13T20:40:17.523 回答
0

正如其他人指出的那样,您无法通过 shell 指令执行 stdout/err 重定向,因为您没有 shell。

您将需要在单独的线程中使用 stdout/stderr,以防止阻塞。有关更多信息,请参阅此答案

于 2009-07-13T20:46:48.183 回答
0

最后(是的,这是一种快速而肮脏的方式)我最终调用了一个执行命令并使用管道和重定向的 .bat 文件。我确信这不是最好的解决方案,但它可以满足我的需要。

于 2009-07-14T13:37:25.560 回答