1

.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)
4

5 に答える 5

5

シェルなしでシェル コマンドを実行しようとしています。

つまり、シェルが解釈するもの (具体的にはパイプ'|'と追加'>>') を実行しようとしています。これを解決するには、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"};
于 2009-07-13T20:39:37.837 に答える
2

リダイレクトとパイプは機能しません。これらはコマンドの一部ではありませんが、cmd.exe ウィンドウなどからこの行を実行すると、基盤となるシェルが評価されることに依存しています。

exec() メソッドから取得した Process オブジェクトの入力および出力ストリームを使用する必要があります。

手元にある特定のクエリ ツールを使用するのではなく、Active Directory にクエリを実行することが主な関心事である場合は、すべて Java のソリューションを検討する必要があります。LDAP ディレクトリ (Active Directory も同様) にアクセスするには、いくつかの方法があります。たとえば、次のようになります。

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

私自身はまだ使っていませんが、2008年からリリースされているので廃盤ではないようです。

于 2009-07-13T20:40:25.777 に答える
0

他の人が指摘しているように、シェルがないため、シェル命令を介して stdout/err リダイレクトを実行することはできません。

ブロックを防ぐために、別のスレッドで stdout/stderr を使用する必要があります。詳細については、この回答を参照してください。

于 2009-07-13T20:46:48.183 に答える
0

最後に (そして、これは少し手っ取り早い汚い方法でした)、コマンドを実行し、パイプとリダイレクトを使用する .bat ファイルを呼び出すことになりました。それは最善の解決策ではないと確信していますが、必要なものには機能します。

于 2009-07-14T13:37:25.560 に答える
0

「追加」(>>)と「パイプ」(|)は許可されていないと思います。

配列内の各項目に場所を与えることで、それを試すことができます。

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

そして、何が起こるか見てください。

于 2009-07-13T20:40:17.523 に答える