Batch Datei über Runtime.getRuntime().exec() auf DOS ausführen

Zonbleou

Grünschnabel
Hallo Leute,
ich habe ein Problem und brauche dringend eure Hilfe. Ich habe ein kleines JFileChooser Programm geschrieben mit dem ich eine BAtch Datei aus einem externen Verzeichnis über Runtime.getRuntime().exec() ausführen kann. Das heißt ich habe meinen Eclipse auf meinem Laufwerk D:\ installiert. Jetzt will ich meine BATch Datei zum Bsp. auf dem Laufwerk G:\ ausführen. Wenn ich mein Programm starte, ich komme nicht vom dem Workspace raus. Das Programm versucht immer meine Datei auf D:\....\.....\workspace> auszuführen.
Weisst jemand, ob es überhaupt möglich ist mit Java die Dateien auf externen Verzeichnisse auszuführen? Hier gebe ich mein Programm mit. Die auszuführende Aktion befindet sich in der internen Klasse SaveL. Ich mache das ganze mit ActionListener.
Java:
 class SaveL implements ActionListener {
 public void actionPerformed(ActionEvent e)
    {
         JFileChooser c = new JFileChooser();
       // Demonstrate "Save" button action
           if(e.getSource() == save)
            {
                 int rVal = c.showSaveDialog(FileChooserTest.this);
                 if (rVal == JFileChooser.APPROVE_OPTION)
	  {
	   filename.setText(c.getSelectedFile().getName());
	  directory.setText(c.getCurrentDirectory().toString());
	   }
          }else if(e.getSource() == starten )
      {

 // Ausgabe des Directory Inhaltes
    result1 = result1.replace("\\", "\\");
    result2 = result2.replace("\\", "\\");
// System.out.println("Es wird von diesem File gelesen: " + result2 );  
			    	
// Inhalt von filename soll hier gelesen werden
     String myFile = result2; 
     StringBuffer buff = null;
     FileReader fr = null;
     try{
             fr = new FileReader(myFile);  
             int theChar;
             buff = new StringBuffer();
			      		
             while(((theChar = fr.read()) != -1)){
	buff.append((char)theChar);
	}
    } 
    catch(IOException ioe){
                        ioe.printStackTrace();
	}
//
	finally{
	if(fr != null){
	try{
	     fr.close();
	}
	catch(IOException ioe){}
                    }
           }
         if(buff != null)
  //System.out.println( result1 +  buff + suchdatei.getText());
       result3 = result1 + "\\" + buff +"\\"+ suchdatei.getText();
			    	
        try{
        System.out.println(	"Goto driver: " + result3.substring(0, result3.indexOf(":") +  1));
// Process process = Runtime.getRuntime().exec("cmd.exe  /c start \" \""+ result3.substring(0, result3.indexOf(":")+ 1) + "\"");	
// ProcessBuilder processb = new ProcessBuilder("cmd", "/C", "start", result3); 
//Process process = processb.start();
//  int exitValue = process.waitFor();
// System.out.println(exitValue);
			    	
  String cmd = "cmd.exe /C start \"\" \"" + result3 + "\"";
   System.out.println(cmd);
   Process process = Runtime.getRuntime().exec(cmd); 
   process.waitFor();
		   	
    }catch(IOException ie){
	ie.printStackTrace();   		
	}
	catch (InterruptedException e2) {
// TODO Auto-generated catch block
     e2.printStackTrace();
  }

  // Ende Lesezyklus
     }
    else
      {
 // Aktivität von ActionEvent abgebrochen
     suchdatei.setText("You pressed cancel");
      directory.setText("");
       }
   }   
}
Danke im Voraus für eure Hilfe.
Zonbleou
 
Zuletzt bearbeitet von einem Moderator:
Moin Zonbleou,

und willkommen bei Tutorials.de!

Bitte poste Deinen Code mit den Code-Tags (der Button mit '#' im Editor), damit es halbwegs leserlich wird!

Danke und Gruß
Klaus
 
HuHu...

du musst in der Shell das Verzeichnis explizit verändern. Standard mäßig wird er beim aufruf deines Commandos den ursprünglichen Aufrufer-Pfad nehmen (also Workspace)

Also zuerst den Pfad ändern dann (Verkettung der Commandos mit "&" )deinen eigenelichen Befehl:

(rufe nur als Beispiel ein Script auf das mir eine Liste der Dateien im Arbeitsverzeichnis ausgibt, hier würde er mir jetzt eine Liste des Ordners "C:\Neu\ ausgeben
Code:
String cmd = "cmd.exe /C CHDIR C:\\Neu\\ & python C:/test.py";

also allgemein so was wie:
Code:
String cmd = "cmd.exe /C CHDIR [ARBEITSPFAD] & [DATEI_ZUR_AUSFÜHRUNG]";

Hoffe geholfen zu haben
Grüße
Dom
 
Vielen Dank Dom für Deine schnelle Antwort,
ich habe mit Deiner Anweisung versucht, trotzdem hat noch nicht geklappt. Ich vermute ich setzte nicht richtig das was Du mir gesagt hast. Im meinem Programm das neue Verzeichnis wo die Datei auzuführen ist heißt "result3" so lautet meine Anweisung:
String cmd = "cmd.exe /C start \"\" \"" + result3 + "\"";.
Vielleicht könntest Du mir weiter helfen indem Du diese Anweisung entsprechend deiner Lösung änderst?
Vielen vielen Dank noch mal.
Zonbleou
 
String cmd = "cmd.exe /C start \"\" \"" + result3 + "\"";.



mhh. Du musst das auch nach dem Muster machen das ich geschrieben habe :)
Wenn "result3" dein Pfad ist wo die Datei ausgeführt werden soll (Denk an die doppelten Backslashes im Pfad)

Müsste so aussehen:
reusult3: C:\\NeuerPfad\\HierIstmeinPfad\\DaGehtsLos

Bei Deiner Anweisung verstehe ich nicht warum du die Ansführungszeichen Escapst. Mit einem "\" entwertest du das folgende Zeichen sodass es nicht interpretiert wird, so was: \" würde man dann machen wenn man in einem String mit Anführungszeichen haben will (So was würde ja nicht gehen

Code:
"Ich "Hans" bin ein String"
, weil der Compiler dann glaubt das du deinen String abschließen willst vor dem H... dann escapt man:
Code:
"Ich \"Hans\" bin ein String"
). Bei deinem Beispiel Commando würde dann so aussehen wenn Java damit durch ist:

cmd.exe /C start "" "[RESULT3FPAD]" (genau so , mit den Anführungszeichen und ohne Programm das ausgeführt werden soll und ohne CHDIR :))

Ich hatte da wie gesagt eher an so was gedacht
Code:
//Ordner
String result3="C:\\NeuerPfad\\HierIstmeinPfad\\DaGehtsLos"

//Programm
String program="programm.bat"

und dann
Code:
String cmd = "cmd.exe /C CHDIR " + result3 + " & " + program;
 
Vielen Dank Dom,
ich habe die Lösung gefunden. Das Programm funktioniert eingentlich sehr gut nur hat es die Teile zum Ausführen von meiner Batch-Datei gefehlt. Die sollte ich normalerweise zu meiner Ordnerstruktur hinzunehmen.
Danke nochmal.
Zonbleou
 

Neue Beiträge

Zurück