2009-09-14 10 views
8

Ich möchte eine Batch-Datei von einem Java-Programm ausführen.Wie führe ich eine Batch-Datei von Java aus?

Ich verwende den folgenden Befehl.

Runtime.getRuntime().exec("server.bat"); 

Aber das Problem ist, ich will einem reative Weg geben, statt absoluten Pfad, so dass ich das Java-Projekt auf jedem comp bereitstellen kann.

Die dir Struktur des Projekts ist wie wie folgt:

com 
    | 
    project 
    | 
    ------ parser 
    |   |_____ Main.java 
    | 
    -------util 
      |_____ Server.bat 

Ich möchte die „server.bat“ Datei im „util“ dir aus der „Main.java“ Datei im "laufen Parser "dir.

Antwort

5

Wenn Java ausgeführt wird und Sie Runtime.exec() mit einem relativen Pfad verwenden, bedeutet relativ relativ zum aktuellen Benutzerverzeichnis, in dem die JVM aufgerufen wurde.

arbeiten Dies kann

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat"); 

, wenn Sie Java von com übergeordnete Verzeichnis zu starten.

Oder Sie müssen einen vollständigen Pfad berechnen:

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat"); 

ich vergesse, lasen When Runtime.exec() won't.

+0

gibt es keine "Exec" -Methode in Runtime-Klasse, die drei String-Parameter dauert. –

+0

Das ist wahr. Ich meine die String [] Version, aber ich bin nicht in der Lage, quadratische Eltern in SO Textfeld einzugeben ... Ich denke, ich muss SO Handbücher/Wiki lesen ... – PeterMmm

+0

lässt sagen, ich habe drei Befehle, die ausgeführt werden sollen Von CMD werden dann drei separate CMD-Fenster für jeden Befehl geöffnet, gibt es eine Möglichkeit, alle drei Befehle auf einem CMD-Fenster auszuführen. – viveksinghggits

6

Sie haben "cmd.exe" mit den Argumenten "/ c" und "server.bat" auszuführen:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" }); 
8

Sie ProcessBuilder dafür verwenden können. Es bietet viel mehr Kontrolle als exec. Insbesondere erlaubt es das Arbeitsverzeichnis mit der Methode directory einzustellen.

Beispiel:

ProcessBuilder pb = new ProcessBuilder("server.bat"); 
pb.directory(new File(deployDir + "\\com\\project\\util")); 
Process p = pb.start(); 
int exitStatus = p.waitFor(); 

Natürlich müssen Sie Ihre App deployDir bekommen von irgendwo. Es kann in der Umgebung eingestellt werden, in der Anwendungskonfigurationsdatei kann es das aktuelle Benutzerverzeichnis oder etwas anderes sein.

+0

funktioniert nicht für mich weiß nicht, warum –

0

Plexus utils bietet einen Befehlszeilentyp, der eine beliebige Befehlszeile aufrufen und die Analyse der Ausgabe behandeln kann.

Commandline cl = new Commandline(); 

cl.setExecutable("cmd.exe"); 
cl.createArg().setValue("/c"); 

cl.setWorkingDirectory(new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat")); 

cl.createArg().setValue("/c"); 

StreamConsumer consumer = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

StreamConsumer stderr = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

int exitCode; 

try { 
    exitCode = CommandLineUtils.execute(cl, consumer, stderr, getLogger()); 
} catch (CommandLineException ex) { 
    //handle exception 
} 
0

Sie sind die beste Wahl ist das Installationsverzeichnis der Anwendung auf dem System zu speichern und dann verwenden, die Pfade innerhalb der Anwendung zu erstellen. System.getProperty ("user.dir") sollte auf Windows- und Unix-Plattformen funktionieren, um das aktuelle Arbeitsverzeichnis zu erhalten, aber es ist systemabhängig, also sei dir dessen bewusst.

0

Der zweite Parameter für exec ist ein String [] für Args für die Umgebungseinstellungen (null bedeutet, dass der Prozess die aktuellen erbt) und der dritte Parameter für exec sollte eine Datei sein, die das Arbeitsverzeichnis liefert. Versuchen Sie dies:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util")); 
4

Sie können es mit Desktop versuchen, wenn unterstützt (Java 1.6)

+0

Wirklich neu für mich. – Arshed

Verwandte Themen