web-dev-qa-db-fra.com

Comment exécuter des commandes cmd via Java

J'essaie d'exécuter des arguments de ligne de commande via Java. Par exemple:

// Execute command
String command = "cmd /c start cmd.exe";
Process child = Runtime.getRuntime().exec(command);

// Get output stream to write from it
OutputStream out = child.getOutputStream();

out.write("cd C:/ /r/n".getBytes());
out.flush();
out.write("dir /r/n".getBytes());
out.close();

Ce qui précède ouvre la ligne de commande mais n'exécute pas cd ou dir. Des idées? J'utilise Windows XP, JRE6.

(J'ai modifié ma question pour qu'elle soit plus précise. Les réponses suivantes ont été utiles, mais ne répondez pas à ma question.)

39
joe

Le code que vous avez posté démarre trois processus différents, chacun avec sa propre commande. Pour ouvrir une invite de commande, puis exécuter une commande, essayez ce qui suit (je n'ai jamais essayé moi-même):

try {
    // Execute command
    String command = "cmd /c start cmd.exe";
    Process child = Runtime.getRuntime().exec(command);

    // Get output stream to write from it
    OutputStream out = child.getOutputStream();

    out.write("cd C:/ /r/n".getBytes());
    out.flush();
    out.write("dir /r/n".getBytes());
    out.close();
} catch (IOException e) {
}
3
Peter Knego

J'ai trouvé cela dans les forums.Oracle.com

Permet la réutilisation d'un processus pour exécuter plusieurs commandes sous Windows: http://kr.forums.Oracle.com/forums/thread.jspa?messageID=9250051

Vous avez besoin de quelque chose comme

   String[] command =
    {
        "cmd",
    };
    Process p = Runtime.getRuntime().exec(command);
    new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
    new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
    PrintWriter stdin = new PrintWriter(p.getOutputStream());
    stdin.println("dir c:\\ /A /Q");
    // write any other commands you want here
    stdin.close();
    int returnCode = p.waitFor();
    System.out.println("Return code = " + returnCode);

Classe SyncPipe:

class SyncPipe implements Runnable
{
public SyncPipe(InputStream istrm, OutputStream ostrm) {
      istrm_ = istrm;
      ostrm_ = ostrm;
  }
  public void run() {
      try
      {
          final byte[] buffer = new byte[1024];
          for (int length = 0; (length = istrm_.read(buffer)) != -1; )
          {
              ostrm_.write(buffer, 0, length);
          }
      }
      catch (Exception e)
      {
          e.printStackTrace();
      }
  }
  private final OutputStream ostrm_;
  private final InputStream istrm_;
}
63
Pepe

Si vous voulez exécuter plusieurs commandes dans le shell cmd, vous pouvez construire une seule commande comme ceci:

  rt.exec("cmd /c start cmd.exe /K \"cd c:/ && dir\"");

Cette page explique plus.

15
Vincent Ramdhanie

Essayez ceci link

Vous n'utilisez pas "cd" pour changer le répertoire à partir duquel exécuter vos commandes. Vous avez besoin du chemin complet de l'exécutable que vous voulez exécuter.

Aussi, lister le contenu d'un répertoire est plus facile à faire avec les classes File/Directory

2
Piotr

Chacun de vos appels exec crée un processus. Vos deuxième et troisième appels ne sont pas exécutés dans le même processus Shell que vous avez créé dans le premier. Essayez de mettre toutes les commandes dans un script de batte et de le lancer en un seul appel: rt.exec("cmd myfile.bat"); ou similaire

1
Carles Barrobés

Ecrire dans le flux sortant du processus est une mauvaise direction. 'out' dans ce cas signifie du processus à vous. Essayez d’obtenir/d’écrire dans le flux d’entrée pour le processus et de lire à partir du flux de sortie pour voir les résultats.

0
Kelly S. French

Comme je suis également confronté au même problème et parce que certaines personnes ici présentes ont fait remarquer que la solution ne fonctionnait pas pour elles, voici le lien vers le message où une solution efficace a été trouvée.

https://stackoverflow.com/a/24406721/3751590

Voir également "Mise à jour" dans la meilleure réponse pour utiliser le terminal Cygwin.

0
singe3