Java appel d'un batch
Résolu
remousse
Messages postés
299
Date d'inscription
Statut
Membre
Dernière intervention
-
remousse Messages postés 299 Date d'inscription Statut Membre Dernière intervention -
remousse Messages postés 299 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un programme Java qui appel un batch et j'aimerai récupérer le code retour du batch appelé mais cela ne fonctionne pas.
Voici mon code:
Je pensais que process.exitValue() correspondait au code retour mais cela n'a pas l'air de fonctionner, j'ai toujours 0 qui m'est retourné alors que mon batch retourne -2.
Code du batch de test:
Par avance merci.
J'ai un programme Java qui appel un batch et j'aimerai récupérer le code retour du batch appelé mais cela ne fonctionne pas.
Voici mon code:
private int launchBat(String path) throws Exception{ String[] command = { "cmd.exe", "/C", "Start", path }; Process process = null; try { Runtime run = Runtime.getRuntime(); process = run.exec(command); process.waitFor(); return process.exitValue(); } catch (Exception e) { process.destroy(); e.printStackTrace(); return 99; } }
Je pensais que process.exitValue() correspondait au code retour mais cela n'a pas l'air de fonctionner, j'ai toujours 0 qui m'est retourné alors que mon batch retourne -2.
Code du batch de test:
@echo off echo toto exit /B -2
Par avance merci.
A voir également:
- Java appel d'un batch
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Appel privé - Guide
- Eclipse java - Télécharger - Langages
2 réponses
exitValue fait bien ce que tu veux, mais tu l'appliques au processus de cmd.exe, et c'est lui qui renvoie 0 quand il termine, pas le script qu'il a lancé en paramètre.
Si tu veux obtenir -2, tu dois créer le processus directement sur le script !
Au passage :
1) tu ne récupères pas les flux de sortie donc tu ne vois pas s'afficher "toto"
2) tu gères tes exceptions, il n'est donc pas nécessaire de faire throws Exception
3) avec une initialisation à null, tu peux entrer dans le catch avec process==null, il ne faut donc pas directement lui appliquer la méthode destroy.
Si tu veux obtenir -2, tu dois créer le processus directement sur le script !
Au passage :
1) tu ne récupères pas les flux de sortie donc tu ne vois pas s'afficher "toto"
2) tu gères tes exceptions, il n'est donc pas nécessaire de faire throws Exception
3) avec une initialisation à null, tu peux entrer dans le catch avec process==null, il ne faut donc pas directement lui appliquer la méthode destroy.
private static int launchBat(String path) { Process process = null; try { process = Runtime.getRuntime().exec(path); process.waitFor(); Scanner out = new Scanner(process.getInputStream()); while (out.hasNextLine()) System.out.println(out.nextLine()); out.close(); Scanner err = new Scanner(process.getErrorStream()); while (err.hasNextLine()) System.err.println(err.nextLine()); err.close(); return process.exitValue(); } catch (Exception e) { if (process!=null) process.destroy(); e.printStackTrace(); return 99; } }
J'ai testé ce que tu as mis mais je n'ai toujours pas mon code retour -2 dans le exitValue().
Qu'entends-tu par "Si tu veux obtenir -2, tu dois créer le processus directement sur le script ! " ?
Merci pour ta réponse
Qu'entends-tu par "Si tu veux obtenir -2, tu dois créer le processus directement sur le script ! " ?
Merci pour ta réponse
J'ai peut-être mal compris à quoi correspondait la valeur "path", pour moi launchBat(String path) signifie que le script à exécuter c'est path, et dans ce cas il faut faire exec(path); comme je l'ai fait.
Mais si je regarde à nouveau ton code, "path" n'a l'air d'être qu'une option de ton script "Start", dans ce cas il faut faire exec(new String[] {"Start", path});
Dans tous les cas, il ne faut pas faire appel à "cmd.exe" parce que sinon c'est sa valeur de retour qui va être renvoyée et pas celle du script lancé.
Mais si je regarde à nouveau ton code, "path" n'a l'air d'être qu'une option de ton script "Start", dans ce cas il faut faire exec(new String[] {"Start", path});
Dans tous les cas, il ne faut pas faire appel à "cmd.exe" parce que sinon c'est sa valeur de retour qui va être renvoyée et pas celle du script lancé.
"path" correspond au chemin de mon script en l'occurrence pour mon test path= C:\process.bat.
Voilà ma sortie d'écran de mon programme java. (j'ai ajouter la ligne
j'obtiens toujours 0 alors que je fais un
Voilà ma sortie d'écran de mon programme java. (j'ai ajouter la ligne
System.out.println(process.exitValue());juste avant le return pour afficher le code retour.
C:\>start_all.bat Lancement du programme Nombre de lancement demandé : 1 Lancement n°1 toto 0
j'obtiens toujours 0 alors que je fais un
exit /B -2
Moi j'avais testé tout à l'heure et je viens de le tester à nouveau, mais sans rien changer j'ai bien -2
Contenu de Test.cmd :
Affichage du programme :
import java.util.Scanner; public class Test { private static int launchBat(String path) { Process process = null; try { process = Runtime.getRuntime().exec(path); process.waitFor(); Scanner out = new Scanner(process.getInputStream()); while (out.hasNextLine()) System.out.println(out.nextLine()); out.close(); Scanner err = new Scanner(process.getErrorStream()); while (err.hasNextLine()) System.err.println(err.nextLine()); err.close(); return process.exitValue(); } catch (Exception e) { if (process!=null) process.destroy(); e.printStackTrace(); return 99; } } public static void main(String...args) { System.out.println(launchBat("Test.cmd")); } }
Contenu de Test.cmd :
@echo off echo toto exit /B -2
Affichage du programme :
toto -2
Est-ce que quand tu exécutes le script sans Java il te renvoie aussi 0 ?
La seule chose que je vois c'est que peut-être ta version de Windows ne supporte pas les codes de retour négatif et les remplace par 0, dans ce cas il faudrait essayer avec une valeur positive.
Ceci dit, Java n'est pas fait pour exécuter des scripts, il sait le faire bien sûr, mais il est suffisamment complet pour avoir ses propres commandes systèmes, et qui plus est multi-plateforme, ce que ne sont pas les scripts...
La seule chose que je vois c'est que peut-être ta version de Windows ne supporte pas les codes de retour négatif et les remplace par 0, dans ce cas il faudrait essayer avec une valeur positive.
Ceci dit, Java n'est pas fait pour exécuter des scripts, il sait le faire bien sûr, mais il est suffisamment complet pour avoir ses propres commandes systèmes, et qui plus est multi-plateforme, ce que ne sont pas les scripts...