it-swarm.com.de

Wie öffne ich den Befehl Aufforderung und füge Befehle mit Java ein?

Ist es möglich, den Befehl Prompt (und ich schätze ein anderes Terminal für andere Systeme) zu öffnen und Befehle in dem neu geöffneten Fenster auszuführen? 

Derzeit habe ich Folgendes:

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

Ich habe versucht, den nächsten Befehl nach dem "Start" hinzuzufügen, ich habe versucht, ein anderes rt.exec auszuführen, das meinen Befehl enthält, aber ich kann keinen Weg finden, damit es funktioniert. 

Wenn es wichtig ist, versuche ich, einen Befehl ähnlich dem folgenden auszuführen:

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

EDITLeider habe ich einige seltsame Ergebnisse gefunden. Ich konnte den Befehl Prompt erfolgreich starten und einen Befehl mit folgendem Befehl übergeben:

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

Es scheint jedoch nur mit einem Befehl zu funktionieren. Wenn ich versuche, den Befehlstrenner wie folgt zu verwenden, "cmd.exe/c Startbefehl & Befehl2", wird der zweite Befehl durch den Hintergrund geleitet (so, wenn ich nur rt.exec ("Befehl2") verwende.) . Jetzt ist das Problem hier, ich habe erkannt, dass ich das Verzeichnis ändern muss, in dem die Eingabeaufforderung ausgeführt wird. Wenn ich nur den vollständigen Pfad zur JAR-Datei verwende, liest die JAR-Datei die Daten falsch aus dem Active Directory der Eingabeaufforderung, nicht Das jar-Verzeichnis, in dem sich die Ressourcen befinden. 

38
404 Not Found

Ich weiß, dass Leute empfehlen, sich von rt.exec (String) fernzuhalten, aber das funktioniert und ich weiß nicht, wie ich es in die Array-Version umwandeln kann.

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

Wenn Sie zwei Befehle gleichzeitig ausführen, um nur das Verzeichnis zu ändern, in dem die Eingabeaufforderung ausgeführt wird, gibt es eine Überladung für die Methode Runtime.exec, mit der Sie das aktuelle Arbeitsverzeichnis angeben können. Mögen,

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

Dadurch wird der Befehl Eingabeaufforderung im Verzeichnis bei newDir geöffnet. Ich denke, Ihre Lösung funktioniert auch, aber dadurch wird Ihre Befehlszeichenfolge oder das Array etwas sauberer.

Es gibt eine Überladung, wenn der Befehl als String und der Befehl als String-Array verwendet wird.

Es kann jedoch noch einfacher sein, den ProcessBuilder zu verwenden, der eine directory-Methode hat, um Ihr aktuelles Arbeitsverzeichnis festzulegen.

Hoffe das hilft.

8
Zach L

Folgendes funktioniert für mich bei Snow Leopard:

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

Wenn Sie die Ausgabe dieses Befehls lesen möchten, müssen Sie den Eingabestrom des Prozesses lesen. Zum Beispiel,

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

Ermöglicht das einfache Lesen der zeilenweisen Ausgabe des Befehls.

Das Problem kann auch sein, dass MS-DOS Ihre Reihenfolge der Argumente nicht als "Neue Eingabeaufforderung starten" interpretiert. Ihr Array sollte wahrscheinlich sein:

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

Um Befehle in der neuen Eingabeaufforderung zu öffnen, müssen Sie die Prozessreferenz verwenden. Ich bin mir jedoch nicht sicher, warum Sie das tun möchten, wenn Sie mit exec nur die Person vor mir kommentieren können.

3
ktm5124

Sie müssen lediglich Ihren Befehl nach dem Start in der Zeichenfolge anhängen, die Sie übergeben.

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

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

Bitte platzieren Sie Ihren Befehl in einem Parameter wie dem unten genannten.

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

Sie können jeden on-Prozess für einen dynamischen Pfad an der Eingabeaufforderung verwenden

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

Sie müssen alle \" (Anführungszeichen) sorgfältig setzen. Der Parameter \k wird verwendet, um die Eingabeaufforderung nach der Ausführung geöffnet zu lassen. 

1) um 2 Befehle zu kombinieren (zum Beispiel pause und ipconfig)

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

2) um den Inhalt einer Dateianwendung anzuzeigen (MORE ist ein Befehlszeilen-Viewer unter Windows)

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

Ein Verschachtelungszitat\"steht für den Befehl und den Dateinamen, das zweite Anführungszeichen \" steht für den Dateinamen selbst, insbesondere für Leerzeichen usw..

0
mikeLEI