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   -
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.

A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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;
    }
}
0
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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é.
0
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
 
"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
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
0
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   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.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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...
0