Java appel d'un batch [Résolu/Fermé]

Signaler
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
-
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
-
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:

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.

2 réponses

Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
2 845
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.

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;
    }
}
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
6
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
Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
2 845
Moi j'avais testé tout à l'heure et je viens de le tester à nouveau, mais sans rien changer j'ai bien -2

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
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
6
je viens de copier/coller ce que tu as codé et j'obtiens:
toto
0


Là je ne comprends plus rien...
Peut être un problème d'environnement ou autre.
Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
2 845
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...
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
6
j'ai testé en lançant le batch via un autre batch et j'obtiens bien -2
j'ai également testé avec un code retour fixé à 1000 et le programme java me retourne 0.

Je vais essayé de trouver une solution de contournement à mon problème.

Je te remercie pour ton aide.
Messages postés
299
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
20 novembre 2014
6
Petite précision je viens de faire un dernier test en modifiant le fichier batch comme ceci:

@echo off
echo toto
toto.bat


J'ai donc enlevé le exit. De plus le batch toto.bat n'existe pas donc code retour égal à 1 et là aucun problème le exitValue() me renvoie 1.

J'ai l'impression que le code retour que je récupérait avant était celui de la commande exit /B -2 qui forcément se déroule toujours sans problème donc un code retour à 0.