2009-09-14 6 views
8

Je veux exécuter un fichier batch à partir d'un programme Java.Comment exécuter un fichier batch à partir de Java?

J'utilise la commande suivante.

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

Mais le problème est que je veux donner un chemin reative au lieu de chemin absolu pour que je puisse déployer ce projet java sur une maquette.

La structure dir du projet est comme comme suit:

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

Je veux exécuter le fichier « server.bat » dans le répertoire « util » du fichier « Main.java » dans le " analyseur "dir.

Répondre

5

Lorsque Java est en cours d'exécution et que vous utilisez Runtime.exec() avec un chemin relatif, les moyens relatifs par rapport au répertoire de l'utilisateur actuel, où la machine virtuelle Java a été appelée.

Cela peut fonctionner

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

si vous démarrez java à partir du répertoire parent de com.

Ou vous devez calculer un chemin absolut:

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

J'oublie, lire When Runtime.exec() won't.

+0

il n'y a pas de méthode "exec" dans la classe Runtime qui prend trois paramètres de chaîne. –

+0

C'est vrai. Je veux dire la version String [] mais je ne suis pas en mesure d'entrer parenthsis carré dans la zone de texte SO ... je pense que je dois lire SO manuels/wiki ... – PeterMmm

+0

laisse dire que j'ai trois commandes qui sont censées être exécutés à partir de CMD alors trois fenêtres CMD séparées seront ouvertes pour chacune de la commande, est-il un moyen que je peux exécuter les trois commandes sur une fenêtre CMD .. – viveksinghggits

6

vous devez exécuter "cmd.exe" avec les arguments "/ c" et "server.bat":

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

Vous pouvez utiliser ProcessBuilder pour cela. Il fournit beaucoup plus de contrôle que exec. En particulier, il permet de définir le répertoire de travail avec la méthode directory.

Exemple:

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

Bien sûr, votre application doit se deployDir de quelque part. Il peut être défini dans l'environnement, dans le fichier de configuration de l'application, il peut s'agir du répertoire de l'utilisateur actuel ou de tout autre élément.

+0

ne fonctionne pas pour moi ne sais pas pourquoi –

0

Plexus utils fournit un type de ligne de commande qui peut appeler une ligne de commande arbitraire et gérer l'analyse de la sortie.

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

Vous êtes le meilleur pari est de stocker le répertoire d'installation de l'application sur le système et l'utiliser ensuite pour construire vos chemins dans l'application. System.getProperty ("user.dir") devrait fonctionner sur les plates-formes Windows et Unix pour obtenir le répertoire de travail actuel, mais cela dépend du système, alors soyez conscient de cela.

0

Le deuxième paramètre à exec est un String [] d'arguments pour les paramètres d'environnement (null signifie hériter ceux du processus) et le troisième paramètre à exec devrait être un fichier fournissant le répertoire de travail. Essayez ceci:

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

Vous pouvez essayer avec Desktop si supporté (Java 1.6)

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

Vraiment nouveau pour moi. – Arshed

Questions connexes