# CMD über Java öffnen



## lam_tr (24. Jun 2011)

Hallo zusammen,

weiss hier jemand wie ich cmd.exe über Java öffnen kann so dass der gewünschte Ordner auch schon selektiert wird.

Beispiel ich will den c:\test Ordner in der Konsole öffnen, wie kann ich es machen?

Runtime.getRuntime().exec("cmd /c start cmd.exe");

und wie mache ich den "cd c:\test" Aufruf?

Gruss lam


----------



## thewulf00 (24. Jun 2011)

Also eine kurze Google-Suche liefert mir, dass man mittels 
	
	
	
	





```
cmd /k <befehl>
```
 einen ersten Befehl absetzen kann.
Wie man in Java einen Befehl ans OS weiterreicht, hast Du ja bereits erkannt. Also wo ist das Problem?


----------



## r.w. (24. Jun 2011)

thewulf00 hat gesagt.:


> Also eine kurze Google-Suche liefert mir, dass man mittels
> 
> 
> 
> ...



Naja, z.B. könnte das Problem auftreten, dass das Verzeichnis nicht auf dem aktuellen Laufwerk liegt.
Dann bräuchte man nämlich 2 Befehle (einen zum Laufwerkswechsel und einen für das Verzeichis).

In dem Fall könnte man sich z.B. so behelfen:

```
//...

    public static void main(String[] args) {
      try {
         Runtime runtime = Runtime.getRuntime();

         // Erste Shell oeffnen...
         // In dieser Instanz wird schon in das
         // Laufwerk:\Verzeichnis gewechselt,
         // jedoch kein neues Fenster geoeffnet.
         // Daher wird aus dieser Instanz spaeter noch einmal
         // eine weitere Shell mit "start" aufgerufen, die
         // sich dann schon im richtigen Verzeichnis befindet.
         Process process = runtime.exec("cmd.exe /K"); 
         OutputStream os = process.getOutputStream();
         OutputStreamWriter ow = new OutputStreamWriter(os);
         BufferedWriter bw = new BufferedWriter(ow);

         // Wechel des Laufwerks
         bw.write("c:");
         bw.newLine();
         // Verzeichnis wechseln
         bw.write("cd \\temp");
         bw.newLine();
         // dann, neue Shell oeffnen 
         // mit ggf. weiterer Anweisung wie hier z.B. "dir"
         bw.write("start cmd.exe /K dir"); 
         bw.newLine();

         // Hier machen weitere Anweisungen keinen Sinn, da diese in der
         // ersten (unsichtbaren) Instanz der Shell ausgeführt werden wuerden.

         bw.flush();
         bw.close();
         ow.close();
         os.close();

      } catch (IOException ex) {
         Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
      }
    }

//...
```

Ist nur so auf die Schnelle zusammengestrickt und irgendwie noch eine Krücke,
denn die erste Shell öffnet bei mir nur dann ein Fenster, wenn ich sie per 
"start cmd.exe /K" aufrufe. Dann bekomme ich allerdings keinen OutputStream 
mehr zur cmd.exe sondern zur aufrufenden Instanz.

Wenn man direkt die erste Instanz der Shell als Fenster öffnen könnte und für diese 
auch noch einen OutputStream hätte, würde das die Sache natürlich erleichtern und
auch weitere Anweisungen möglich machen. Hat dazu jemand einen Tipp?

Klar könnte man sich zu dieser natürlich auch den InputStream holen, aber ich denke,
das würde den Rahmen für diesen Fall hier sprengen.

VG ROlf


----------



## thewulf00 (24. Jun 2011)

r.w. hat gesagt.:


> Naja, z.B. könnte das Problem auftreten, dass das Verzeichnis nicht auf dem aktuellen Laufwerk liegt.
> Dann bräuchte man nämlich 2 Befehle (einen zum Laufwerkswechsel und einen für das Verzeichis).



[c]cmd /k "E: & cd\test"[/c]


----------



## Asgar13 (24. Jun 2011)

Ist das nur für dich, sonst musst du mit den Laufwerkbuchstaben aufpassen, manche haben  C: andere benutzen D: und wieder andere E: .


----------



## thewulf00 (24. Jun 2011)

Asgar13 hat gesagt.:


> Ist das nur für dich, sonst musst du mit den Laufwerkbuchstaben aufpassen, manche haben  C: andere benutzen D: und wieder andere E: .


Ist das Dein Ernst, dass Du von einem Code-Beispiel nicht auf die generische Variante schließen kannst?
Der TO hat nach einer Variante gefragt, CMD aus Java aufzurufen und in C:\Test zu beginnen. Das habe ich ihm gezeigt.
Danach kritisierte jemand diese Lösung, weil es nur C: beinhaltet. Also habe ich gezeigt, wie es auf jedem Laufwerk geht.
Und nun kommst Du und kritisierst ... was genau?

Herrje, ich wusste vor diesem Thread auch nicht, wie das geht. Aber ich kann google anscheinend bedienen. Wer immer noch Fragen oder Kritik hat: nur her damit! Aber sachlich bleiben und die Angaben auch verstehen.


----------



## r.w. (24. Jun 2011)

thewulf00 hat gesagt.:


> Ist das Dein Ernst, dass Du von einem Code-Beispiel nicht auf die generische Variante schließen kannst?...



Nachdem ich schon einige deiner Beiträge gelesen hab, scheinst Du ein etwas dünnes Nervenkostüm zu haben... ;-)



thewulf00 hat gesagt.:


> ```
> cmd /k "E: & cd\test"
> ```



Meinen Code-Ausschnitt habe ich getestet.

DU scheinst Deinen allerdings nicht mit dem runtime.exec(...) getestet zu haben. 
Sonst hättest Du gemerkt, dass sich da kein Fenster auftut. Und das ist es,
worum es dem TO ging.


----------



## thewulf00 (24. Jun 2011)

r.w. hat gesagt.:


> Nachdem ich schon einige deiner Beiträge gelesen hab, scheinst Du ein etwas dünnes Nervenkostüm zu haben... ;-)


Ja, das stimmt wohl 





r.w. hat gesagt.:


> Meinen Code-Ausschnitt habe ich getestet.
> 
> DU scheinst Deinen allerdings nicht mit dem runtime.exec(...) getestet zu haben.
> Sonst hättest Du gemerkt, dass sich da kein Fenster auftut. Und das ist es,
> worum es dem TO ging.


Gut, Du hast mich erwischt. Dann machs eben so: Getestet und für gut befunden.

```
import java.io.File;
import java.io.IOException;

public class CmdTest
{
    public static void main(String[] args) throws IOException
    {
        ProcessBuilder pb = new ProcessBuilder( "cmd", "/k", "start" );
        pb.directory( new File( "C:\\test" ) );
        pb.start();
    }
}
```


Ach ja und für jene Beispiel-Kopierer:

```
import java.io.File;
import java.io.IOException;

public class CmdTest
{
    public static void main(String[] args) throws IOException
    {
        String laufwerk    = "c";
        String verzeichnis = "test";
        
        ProcessBuilder pb = new ProcessBuilder( "cmd", "/k", "start" );
        pb.directory( new File( laufwerk+":\\"+verzeichnis ) );
        pb.start();
    }
}
```


----------



## r.w. (24. Jun 2011)

thewulf00 hat gesagt.:


> ```
> import java.io.File;
> import java.io.IOException;
> 
> ...



Hey, das ist gut! Wieder etwas dazu gelernt. 

VG ROlf


----------

