2009-09-14 4 views
8

Voglio eseguire un file batch da un programma java.Come eseguire un file batch da java?

Sto usando il seguente comando.

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

ma il problema è che voglio dare un percorso reative invece di percorso assoluto in modo che possa distribuire quel progetto Java su qualsiasi comp.

La struttura dir del progetto è come come segue:

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

voglio eseguire il file "server.bat" nella directory "util" dal file "Main.java" nel " parser "dir.

risposta

5

Quando Java è in esecuzione e si utilizza Runtime.exec() con un percorso relativo, mezzi relativi relativi alla directory utente corrente, in cui è stata richiamata la JVM.

Questo può funzionare

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

se si inizia java dalla directory superiore del com.

Oppure è necessario calcolare un percorso assoluto:

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

dimentico, leggere When Runtime.exec() won't.

+0

Non esiste un metodo "exec" in classe runtime che prende tre parametri di stringa. –

+0

Questo è vero. Intendo la versione String [] ma non sono in grado di inserire parentesi quadra nella casella di testo SO ... penso di dover leggere SO manuali/wiki ... – PeterMmm

+0

diciamo che ho tre comandi che dovrebbero essere eseguiti da CMD poi verranno aperte tre finestre CMD separate per ciascun comando, c'è un modo per eseguire tutti e tre i comandi su una finestra CMD. – viveksinghggits

6

Devi eseguire "cmd.exe" con gli argomenti "/ C" e "server.bat":

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

È possibile utilizzare ProcessBuilder per questo. Offre molto più controllo di exec. In particolare, consente di impostare la directory di lavoro con il metodo directory.

Esempio:

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

Naturalmente, la vostra applicazione deve ottenere deployDir da qualche parte. Può essere impostato in ambiente, nel file di configurazione dell'applicazione, può essere la directory utente corrente o qualsiasi altra cosa.

+0

non funziona per me non so perché –

0

Plexus utils fornisce un tipo di riga di comando che può richiamare una riga di comando arbitraria e gestire l'analisi dell'output.

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

Sei migliore da fare è quella di memorizzare la directory di installazione dell'applicazione sul sistema e quindi utilizzare tale per costruire i percorsi all'interno dell'applicazione. System.getProperty ("user.dir") dovrebbe funzionare su piattaforme Windows e Unix per ottenere la directory di lavoro corrente, ma dipende dal sistema, quindi tenetene conto.

0

Il secondo parametro da eseguire è una stringa [] di argomenti per le impostazioni dell'ambiente (null significa ereditare i processi "correnti") e il terzo parametro da exec deve essere un file che fornisce la directory di lavoro. Prova questo:

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

Puoi provarlo con Desktop se supportato (Java 1.6)

File file = new File("server.bat"); 
    Desktop.getDesktop().open(file); 
+0

Davvero nuovo per me. – Arshed