Domanda

Sto avendo alcuni problemi con ricevendo il .getruntime.exec () per funzionare correttamente. Ecco il codice che fare con quella parte:

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();
}

esso stampa il comando come dovrebbe apparire. Quando eseguo il programma ecco l'output:

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)
È stato utile?

Soluzione

Si sta tentando di eseguire un comando di shell senza il guscio.

Cioè, si sta cercando di eseguire qualcosa che un guscio interpreterebbe (in particolare il tubo di '|' e aggiungere '>>'). Per risolvere questo problema, ha Java eseguire un'istanza shell e passare l'intero comando alla shell. Come questo dovrebbe funzionare dipende dalla piattaforma.

Per esempio, in Linux:

String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

o in Windows:

String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

Altri suggerimenti

I redirezione e di pipe non funzionano - non sono una parte del comando, ma si basano sul guscio sottostante da valutare quando si esegue questa linea da e. g. una finestra cmd.exe.

Sarà necessario utilizzare i flussi di ingresso e di uscita degli oggetti di processo che si ottiene dal metodo exec ().

Se la vostra preoccupazione principale è quello di query in Active Directory, non si utilizza lo strumento di query specifica a portata di mano, si dovrebbe considerare l'idea di una soluzione all-Java. Ci sono diversi modi per accedere alle directory LDAP (che Active Directory è anche), per esempio qui:

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

Non ho ancora usato io stesso, tuttavia non sembra abbandonato in quanto vi sono uscite dal 2008.

Credo che la "append" (>>) e la "pipe" (|) non sono ammessi.

Si potrebbe provare dando ogni elemento un posto nella matrice:

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

e vedere cosa succede.

Come altri hanno fatto notare, non è possibile eseguire il reindirizzamento stdout / err tramite istruzioni di shell, in quanto non si dispone di una shell.

Sarà necessario consumare output / error in thread separati, per evitare il blocco. Vedi questa risposta per ulteriori informazioni.

Alla fine (e sì, questo è stato un po 'un modo rapido e sporco) ho finito per chiamare un file .bat che ha eseguito il comando e ha usato le tubazioni e reindirizzamenti. Sono sicuro che non è la soluzione migliore, ma funziona per quello che mi serve.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top