Question

Je vais avoir quelques problèmes à obtenir la .getruntime.exec () pour fonctionner correctement. Voici le code traitant de cette partie:

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

Il imprime la commande telle qu'elle se présente. Quand je lance le programme est la sortie ici:

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)
Était-ce utile?

La solution

Vous essayez d'exécuter une commande shell sans shell.

C'est, vous essayez d'exécuter quelque chose qu'une coquille interpréterait (en particulier la conduite '|' et ajouter '>>'). Pour résoudre ce problème, ont Java exécuter une instance de shell et passer toute commande au shell. Comment cela fonctionnerait dépend plate-forme.

Par exemple sous Linux:

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

Ou dans Windows:

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

Autres conseils

Les redirections et des tubes ne fonctionnent pas - ils ne font pas partie de la commande, mais comptent sur la coque sous-jacente à évaluer lorsque vous exécutez cette ligne de e. g. une fenêtre cmd.exe.

Vous aurez besoin d'utiliser les flux d'entrée et de sortie de l'objet de processus que vous obtenez de la méthode exec ().

Si votre principale préoccupation est d'interroger Active Directory, ne pas utiliser l'outil de requête spécifique à portée de main, vous devriez envisager d'aller pour une solution tout-Java. Il y a plusieurs façons d'accéder à des répertoires LDAP (Active Directory qui est également), par exemple ici:

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

Je ne l'ai pas utilisé moi-même encore, mais il ne semble pas abandonné car il y a des rejets de 2008.

Je suppose que le "append" (>>) et le "pipe" (|) ne sont pas autorisés.

Vous pouvez l'essayer en donnant à chaque élément une place dans le tableau:

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

Et voir ce qui se passe.

Comme d'autres l'ont souligné, vous ne pouvez pas effectuer la redirection stdout / err via des instructions shell, puisque vous ne disposez pas d'un shell.

Vous aurez besoin de consommer stdout / stderr dans des threads séparés, pour empêcher le blocage. Voir cette réponse pour plus d'informations.

En fin de compte (et oui, ce fut un peu un moyen rapide et sale) J'ai fini par appeler un fichier .bat qui a exécuté la commande et utilisé les tuyaux et réoriente. Je suis sûr que ce n'est pas la meilleure solution, mais il fonctionne pour ce que je dois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top