Java Runtime.getRuntime()非法参数异常

Java Runtime.getRuntime()非法参数异常,java,runtime-error,Java,Runtime Error,我在使.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++)

我在使.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();
}
while(行!=null)
{
字符串名称=行;
字符串commandFull=commandFirst+name+commandLast;
String[]fullCommand=新字符串[]{commandFirst,name,commandLast};
对于(int i=0;i>fullList.txt
线程“main”java.lang.IllegalArgumentException中出现异常
位于java.lang.ProcessImpl。(未知源)
位于java.lang.ProcessImpl.start(未知源)
位于java.lang.ProcessBuilder.start(未知源)
位于java.lang.Runtime.exec(未知源)
位于java.lang.Runtime.exec(未知源)
在lookup.main(lookup.java:41)

您试图在不使用shell的情况下执行shell命令

也就是说,您正在尝试执行shell将解释的某些内容(特别是管道
“|”
和追加
“>>”
)。要解决此问题,请让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"};

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

也就是说,您正在尝试执行shell将解释的某些内容(特别是管道
“|”
和追加
“>>”
)。要解决此问题,请让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"};
我猜“附加”(>>)和“管道”(|)是不允许的

您可以尝试在数组中为每个项目指定一个位置:

String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }
看看会发生什么。

我想“附加”(>>)和“管道”(|)是不允许的

您可以尝试在数组中为每个项目指定一个位置:

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

看看会发生什么。

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

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

如果您主要关注ActiveDirectory,而不使用手头的特定查询工具,则应该考虑使用一个完全java的解决方案。有几种方法可以访问LDAP目录(ActiveDirectory也是),例如:


我自己还没有使用过它,但它似乎并没有被放弃,因为2008年发布了一些版本。

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

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

如果您主要关注ActiveDirectory,而不使用手头的特定查询工具,则应该考虑使用一个完全java的解决方案。有几种方法可以访问LDAP目录(ActiveDirectory也是),例如:


我自己还没有使用过它,但它似乎并没有被放弃,因为2008年发布了一些版本。

正如其他人所指出的,您不能通过shell指令执行stdout/err重定向,因为您没有shell


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

正如其他人所指出的,您不能通过shell指令执行stdout/err重定向,因为您没有shell

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

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

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