2009-07-13 93 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

您試圖在沒有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"}; 
0

我猜 「追加」(>>)和 「管」(|)是不允許的。

您可以通過給每個項目在數組中的地方試試:

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

看看會發生什麼。

2

重定向和管道不起作用 - 它們不是命令的一部分,但是當您從e運行此行時,依賴於基礎shell進行評估。 G。一個cmd.exe窗口。

您將需要使用從exec()方法獲得的Process對象的輸入和輸出流。

如果您主要關心的是查詢Active Directory,而不是使用特定的查詢工具,則應考慮採用全Java解決方案。有幾種方法來訪問LDAP目錄(Active Directory所也是),例如這裏:

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

我沒有用它自己,然而它似乎並不被遺棄的,因爲有從2008年的版本。

0

正如其他人指出的那樣,您不能通過shell指令執行stdout/err重定向,因爲您沒有shell。

您需要在單獨的線程中使用stdout/stderr,以防止阻塞。有關更多信息,請參閱this answer

0

最後(是的,這是一種快速和骯髒的方式)我最終調用一個.bat文件執行命令,並使用管道和重定向。我相信這不是最好的解決方案,但它適用於我所需要的。