web-dev-qa-db-fra.com

Comment ouvrir l'invite de commande et insérer des commandes en utilisant Java?

Est-il possible d'ouvrir la commande Invite (et je suppose n'importe quel autre terminal pour d'autres systèmes), et d'exécuter des commandes dans la nouvelle fenêtre? 

Actuellement ce que j'ai est ceci:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});

J'ai essayé d'ajouter la commande suivante après le "démarrage", j'ai essayé d'exécuter un autre fichier rt.exec contenant ma commande, mais je ne trouve pas le moyen de la faire fonctionner. 

Si cela compte, j'essaie d'exécuter une commande similaire à celle-ci:

Java -flag -flag -cp terminal-based-program.jar

EDITMalheureusement, j'ai eu des résultats étranges. J'ai réussi à lancer l'invite de commande et à passer une commande à l'aide de ceci:

rt.exec("cmd.exe /c start command");

Cependant, cela ne semble fonctionner qu'avec une seule commande. Parce que, si j'essaie d'utiliser le séparateur de commande comme ceci, "cmd.exe/c start command & command2", la deuxième commande est transmise à l'arrière-plan (comme ce serait le cas si je venais d'utiliser rt.exec ("command2");) . Maintenant, le problème, c’est que j’ai réalisé que je devais changer le répertoire dans lequel la commande Invite était exécutée, car si j’utilisais simplement le chemin complet du fichier jar, le fichier jar lit incorrectement les données à partir de l’Active Directory de la commande, le répertoire du jar contenant ses ressources. 

38
404 Not Found

Je sais que les gens recommandent de rester à l'écart de rt.exec (String), mais cela fonctionne et je ne sais pas comment le changer en version tableau.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"Java -flag -flag -cp terminal-based-program.jar\"");
22
404 Not Found
public static void main(String[] args) {
    String[] arg = new String[]{"-u root", "-h localhost"};

    try {
        String ss = null;
        Runtime obj = null;
        Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
        BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        writeer.write("dir");
        writeer.flush();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("Here is the standard output of the command:\n");
        while ((ss = stdInput.readLine()) != null) {
            System.out.println(ss);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((ss = stdError.readLine()) != null) {
            System.out.println(ss);
        }

    } catch (IOException e) {
        System.out.println("FROM CATCH" + e.toString());
    }

}
8
hiru

Si vous exécutez deux commandes à la fois pour changer le répertoire dans lequel l'invite est exécutée, il existe une surcharge pour la méthode Runtime.exec qui vous permet de spécifier le répertoire de travail actuel. Comme,

Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));

Cela ouvrira l’invite de commande dans le répertoire newDir. Je pense que votre solution fonctionne aussi bien, mais cela garde votre chaîne de commande ou votre tableau un peu plus propres.

Il y a une surcharge pour avoir la commande en tant que chaîne et pour avoir la commande en tant que tableau String.

Vous trouverez peut-être encore plus facile d'utiliser ProcessBuilder , qui possède une méthode directory pour définir votre répertoire de travail actuel.

J'espère que cela t'aides.

8
Zach L

Ce qui suit fonctionne pour moi sur Snow Leopard:

Runtime rt = Runtime.getRuntime();
String[] testArgs = {"touch", "TEST"};
rt.exec(testArgs);

Le fait est que si vous voulez lire le résultat de cette commande, vous devez lire le flux d'entrée du processus. Par exemple,

Process pr = rt.exec(arguments);
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));

Vous permet de lire très facilement la sortie ligne par ligne de la commande.

Le problème peut également être que MS-DOS n'interprète pas votre ordre d'arguments comme signifiant "démarrer une nouvelle invite de commande". Votre tableau devrait probablement être:

{"start", "cmd.exe", "\ c"}

Pour ouvrir des commandes dans la nouvelle invite de commande, vous devez utiliser la référence Process. Mais je ne sais pas pourquoi vous voudriez le faire quand vous pouvez simplement utiliser exec, comme l'a commenté la personne avant moi.

3
ktm5124

Vous devez juste ajouter votre commande après le démarrage dans la chaîne que vous passez.

String command = "cmd.exe /c start "+"*your command*";

Process child = Runtime.getRuntime().exec(command);
2
Priyanka Singh

Veuillez placer votre commande dans un paramètre comme celui mentionné ci-dessous.

Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
0
Dila Gurung
String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig 
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();
0
Anu

Vous pouvez utiliser n’importe quel processus pour le chemin dynamique sur invite de commande

Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");
0
Rakhee jain

Vous devez définir tous les \" (guillemets) avec soin. Le paramètre \k permet de laisser la commande Invite ouverte après l'exécution. 

1) pour combiner 2 commandes d'utilisation (par exemple pause et ipconfig)

Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());

2) pour afficher le contenu d’une utilisation de fichier (MORE est un visualiseur en ligne de commande sous Windows)

File selectedFile = new File(pathToFile):
Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());

Un guillemet imbriqué\"est pour la commande et le nom du fichier, le second guillemet \" est pour le nom du fichier lui-même, pour les espaces etc.

0
mikeLEI