2011-01-14 4 views
35

Ist es möglich, die Eingabeaufforderung zu öffnen (und ich denke, irgendein anderes Terminal für andere Systeme), und Befehle im neu geöffneten Fenster auszuführen?Wie öffne ich die Eingabeaufforderung und füge Befehle mit Java ein?

Zeit, was ich habe, ist dies:

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

Ich habe versucht, den nächsten Befehl nach dem „Start“ und fügte hinzu, habe ich versucht, einen anderen rt.exec läuft mein Befehl enthält, aber ich kann nicht finde einen Weg, um es zum Laufen zu bringen.

Wenn es darauf ankommt, ich versuche, einen Befehl wie dies auszuführen:

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

EDIT Leider habe ich hatte einige seltsame Ergebnisse. Ich konnte die Eingabeaufforderung erfolgreich starten und einen Befehl mit diesem Befehl übergeben:

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

Es scheint jedoch nur mit einem Befehl zu arbeiten. Wenn ich versuche, den Befehlseparator wie folgt zu verwenden: "cmd.exe/c starte den Befehl & command2", wird der zweite Befehl durch den Hintergrund geleitet (so wie es wäre, wenn ich nur rt.exec ("command2") verwende) ;). Jetzt ist das Problem hier, ich erkannte, dass ich das Verzeichnis ändern muss, in dem die Eingabeaufforderung ausgeführt wird, da, wenn ich nur den vollständigen Pfad zu der JAR-Datei verwende, die JAR-Datei die Daten aus dem Active Directory der Eingabeaufforderung falsch liest das Verzeichnis des Jar, das seine Ressourcen enthält.

+1

Könnten Sie erklären, warum Sie dies versuchen, anstatt nur .exec im java-Befehl auszuführen. Das Befehlsfenster würde automatisch geöffnet werden. –

+0

Siehe den Kommentar Ich legte die Antwort von ktm5124. –

Antwort

20

Ich weiß, dass Leute empfehlen weg von rt.exec (String), aber das funktioniert, und ich weiß nicht, wie man es in die Array-Version ändern.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\""); 
+0

Ich arbeite an etwas ähnlich wie du bist, und ich bin gespannt, wo die/c und/k herkommen. Ich kann nicht scheinen, sie für cmd zu erwähnen. Warum entkommst du auch den Anführungszeichen? Liegt es daran, dass die Werte dazwischen einen Befehl darstellen, der an CMD übergeben werden soll? – Ungeheuer

+2

'cmd /?' ' '/C Führt den durch string angegebenen Befehl aus und beendet dann /K Führt den durch string angegebenen Befehl aus, bleibt aber ' –

3

Die folgenden Werke für mich auf Snow Leopard:

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

Sache ist, wenn Sie die Ausgabe dieses Befehls lesen möchten, müssen Sie den Eingangsstrom des Prozesses zu lesen. Zum Beispiel

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

Ermöglicht Ihnen, die zeilenweise Ausgabe des Befehls ziemlich einfach zu lesen.

Das Problem könnte auch sein, dass MS-DOS die Reihenfolge der Argumente nicht als "eine neue Eingabeaufforderung starten" interpretiert. Ihr Array sollte wohl sein:

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

Um Befehle in der neuen Eingabeaufforderung zu öffnen, dann würden Sie den Prozess Referenz verwenden müssen. Aber ich bin mir nicht sicher, warum du das machen wolltest, wenn du nur Exec benutzen kannst, wie die Person vor mir kommentiert hat.

+0

Der Grund, warum ich Befehle in der neuen Eingabeaufforderung öffnen möchte, liegt darin, dass das Programm, das ich zu starten versuche, ein konsolenbasiertes Programm ist, dessen Eingabe und Ausgabe von der Konsole kommt bzw. geht. Beachten Sie, dass das Programm, das ich starten möchte, nicht eins ist, das ich gemacht habe, also muss ich programmieren, wie es funktioniert, ich kann es nicht ändern. –

6

Wenn Sie auf einmal zwei Befehle ausgeführt wird nur das Verzeichnis der Eingabeaufforderung in läuft zu ändern, gibt es eine Überlastung für die Runtime.exec Methode, die Sie das aktuelle Arbeitsverzeichnis angeben können. Wie,

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

Dies wird die Eingabeaufforderung im Verzeichnis um newDir öffnen. Ich denke, Ihre Lösung funktioniert auch, aber das hält Ihre Befehlszeile oder das Array ein wenig sauberer.

Es gibt eine Überladung für den Befehl als Zeichenfolge und den Befehl als String-Array.

Sie können es jedoch noch einfacher finden, die ProcessBuilder zu verwenden, die über eine directory-Methode verfügt, um Ihr aktuelles Arbeitsverzeichnis festzulegen.

Hoffe, das hilft.

+0

sollte es runtime.exec sein ("cmd.exe/c start") , null, neue Datei (newDir)); – ChanGan

+1

Ich habe dies verwendet, Zeichenfolge newDir = "C: \\ Test \\ Application \\"; runtime.exec ("cmd.exe/c start dir", null, neue Datei (newDir)); unter diesem Ordner, wenn ich einen Befehl ausführen möchte, C: \ Test \ Application \ avt install - Dateiname .. wie geht das? kannst du mir dabei helfen ?? – ChanGan

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

} 
+7

Sie könnten irrelevante Kommentare aus Ihrem Code entfernen und einige relevante hinzufügen. –

1

Fügen Sie einfach Ihren Befehl nach dem Start in die Zeichenfolge, die Sie übergeben.

Zeichenfolge command = "cmd.exe/c start" + "Ihr Befehl";

Prozess Kind = Runtime.getRuntime(). Exec (Befehl);

0

Legen Sie Ihren Befehl in einen Parameter wie unten erwähnt.

Runtime.getRuntime(). Exec ("cmd.exe/c Start cmd/k \" Parameter \ "");