Java Runtime.getRuntime () Недопустимое исключение аргумента - PullRequest
1 голос
/ 14 июля 2009

У меня возникли проблемы с правильной работой .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)

Ответы [ 5 ]

5 голосов
/ 14 июля 2009

Вы пытаетесь выполнить команду оболочки без оболочки.

То есть вы пытаетесь выполнить то, что интерпретирует оболочка (в частности, канал '|' и добавление '>>'). Чтобы решить эту проблему, Java должна выполнить экземпляр оболочки и передать всю команду в оболочку. Как это будет работать, зависит от платформы.

Например, в 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"};
2 голосов
/ 14 июля 2009

Перенаправления и каналы не работают - они не являются частью команды, но полагаются на базовую оболочку, которая будет оценена при запуске этой строки из e. г. окно cmd.exe.

Вам потребуется использовать входной и выходной потоки объекта Process, который вы получаете из метода exec ().

Если ваша главная задача - запрашивать Active Directory, а не использовать конкретный инструмент для запросов, вам следует подумать о том, чтобы выбрать полностью Java-решение. Существует несколько способов доступа к каталогам LDAP (которые также есть в Active Directory), например, здесь:

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

Я сам еще не использовал его, но он не заброшен, так как есть версии 2008 года.

0 голосов
/ 14 июля 2009

В конце (и да, это было немного быстро и грязно), я закончил тем, что вызвал файл .bat, который выполнил команду и использовал каналы и перенаправления. Я уверен, что это не лучшее решение, но оно работает для того, что мне нужно.

0 голосов
/ 14 июля 2009

Как уже отмечали другие, вы не можете выполнять перенаправление stdout / err через инструкции оболочки, так как у вас нет оболочки.

Вам потребуется использовать stdout / stderr в отдельных потоках, чтобы предотвратить блокировку. См. этот ответ для получения дополнительной информации.

0 голосов
/ 14 июля 2009

Полагаю, что "append" (>>) и "pipe" (|) не разрешены.

Вы можете попробовать это, предоставив каждому элементу место в массиве:

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

И посмотри, что получится.

...