JavaのRuntime.getRuntime()不正な引数例外
-
13-09-2019 - |
質問
私が正しく動作するために)(.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)
解決
あなたは、シェルなしでシェルコマンドを実行しようとしている。
それはあなたが(特にパイプ'|'
をして'>>'
を追加)シェルが解釈する何かを実行しようとしている、です。この問題を解決するには、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"};
他のヒント
リダイレクションとパイプが動作しない - 彼らは、コマンドの一部ではありませんが、あなたはeからこの行を実行したときに評価されるべき基本的なシェルに依存しています。グラム。 cmd.exeのウィンドウます。
あなたはEXEC()メソッドから取得Processオブジェクトの入力および出力ストリームを使用する必要があります。
あなたの主な懸念はない手で、特定のクエリツールを使用して、Active Directoryを照会している場合、あなたはすべてのJavaソリューションのために行く考慮すべきです。例えばLDAPディレクトリにアクセスする方法はいくつか(アクティブディレクトリでもある)、ここにあります:
http://developer.novell.com/wiki/index.php/Jldap の
私はまだそれを自分自身を使用していない、しかし、それは2008年からのリリースがあるとして断念していないようです。
私は(>>)「追加」を推測し、「パイプ」(|)が許可されていません。
あなたは配列内の各アイテムに場所を与えることによって、それを試みることができる:
String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }
そして何が起こるか見ています。
、あなたは、シェル命令を介して、標準出力/ ERRのリダイレクトを実行することはできません。
あなたはブロッキングを防止するために、別のスレッドで標準出力/標準エラー出力を消費する必要があります。 をhref="https://stackoverflow.com/questions/882772/capturing-stdout-when-calling-runtime-exec/882795#882795">参照してください。
最後に、私は、コマンドを実行し、パイプやリダイレクトを使用.batファイルを呼び出すことになった(はい、これは迅速かつ汚い方法のビットがありました)。私はそれが最善の解決策ではないと確信しているが、それは私が必要なもののために働くます。