2009-07-13 1 views
1

У меня возникли проблемы с правильной работой .getruntime.exec(). Вот код, относящийся к этой части:Java Runtime.getRuntime() Незаконное исключение аргумента

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

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

То есть вы пытаетесь выполнить что-то, что интерпретирует оболочка (в частности, труба '|' и append '>>'). Чтобы решить эту проблему, попросите 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"}; 
0

Я предполагаю, что "Append" (>>) и "труба" (|) не допускаются.

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

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

И посмотреть, что происходит.

2

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

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

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

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

Я не использовал его сам еще, однако, кажется, не отказались, поскольку есть выпуски с 2008 года.

0

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

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

0

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