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.)
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) {
}
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_;
}
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.
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
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
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.
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.