IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[batch] Récupération du code retour d'une commande


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut [batch] Récupération du code retour d'une commande
    Bonjour,

    Après plusieurs recherches, ici compris dans ce forum, j'ai un problème pour lequel je ne trouve aucune solution. Et pourtant celà semble très bête ...

    Dans un script, je dois lancer une ligne de commande et en récupérer le code retour. Rien de compliqué en apparence.
    Mais voilà si je fais celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set CMDLINE=xcopy
    %CMDLINE%
    echo %ERRORLEVEL% => 4
    xcopy lancé de cette manière remonte un message d'erreur et un code retour à 4.

    Ce qui bizarre, c'est que ERRORLEVEL reste à 0 si on exécute les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set ERRORLEVEL=0
    set CMDLINE=xcopy
    %CMDLINE%
    echo %ERRORLEVEL% => 0
    Quelqu'un saurait-il quelle est la cause de ce comportement et comment le contourner?

  2. #2
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Salut fenrys_1, bienvenue sur le forum.

    Ce qui t'arrive n'a rien de bizarre. Tu as simplement défini une variable avec un nom réservé, et ce que tu obtiens en est la conséquence logique.

    Si tu veux fixer la valeur dynamique d’«errorlevel» à 0, utilise plutôt une commande qui retourne cette valeur.

    Par exemple:

    P.S.: N'oublie pas d'encadrer ton code des balises adéquates.

    Bonne continuation à toi.

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Merci maxim_mum,

    Merci pour l'accueil, la réponse et ton conseil.
    OK pour la variable réservée, on est d'accord.

    Corriges moi si je me trompes, mais une commande remonte un code retour dans la variable ERRORLEVEL, quel qu'il soit (0 si OK, autre si pb).
    Donc dans le principe, je ne comprends pas pourquoi, si ERRORLEVEL a été setté manuellement auparavant, le système n'est plus capable d'attribuer le code retour d'une commande à la variable.

    Maintenant, cet exemple ne correspond pas réellement au problème que j'ai. J'ai un script complexe découpé en fonctions successives et séquencielles.
    Après chaque fonction je récupère le code retour, je l'évalue et le mets de côté dans une variable VAR par exemple.
    Ensuite je passe à l'étape suivante après avoir remis ERRORLEVEL à 0.

    Dans ce cas, comment puis-je récupérer le code retour d'une commande après avoir setté manuellement ERRORLEVEL avec une valeur quelconque? (je ne sais pas si c'est très clair ce que je racontes )

    En gros si je dois faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set ERRORLEVEL=0
    dir /u (option inexistante)
    Comment puis-je récupérer le code retour 1 retourné par dir?

  4. #4
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Citation Envoyé par fenrys_1 Voir le message
    Corriges moi si je me trompes, mais une commande remonte un code retour dans la variable ERRORLEVEL, quel qu'il soit (0 si OK, autre si pb).
    Pas tout à fait, toutes les commandes ne renvoient pas un code de retour.

    Pour ce qui est de la «variable system errorlevel» (tout comme cd, date, time ...), je vais essayer de faire simple, il faut la voire comme un emplacement-mémoire (M1) alloué dynamiquement à chaque nouvelle instance de l'interpréteur de commande. De là, «errorlevel» est référencé de sorte à pointer sur cette zone-mémoire M1.

    Maintenant, si tu as la mauvaise idée de redéfinir la variable réservée «errorlevel» (avec set errorlevel=0) , en dehors d'un contexte local, tu changes son référencement de sorte à pointer sur une nouvelle zone-mémoire M2.

    Ainsi, même si la zone-mémoire M1 est toujours correctement renseigné par le système, c'est à dire continuellement mise à jour avec les bons codes de retour, ta variable, quant à elle, pointera dorénavant sur M2 (ce qui correspond à la valeur précédemment définie: 0).

    Un moyen simple de "remplir" M1 avec la valeur que l'on souhaite, c'est d'envoyer un code de retour au système, et le laisser s'occuper du reste.

    Ainsi, ton code devient par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo a | find "a">NUL
    dir /u (option inexistante)
    echo %errorlevel%
    L'avantage de l'instruction «echo a | find "a">NUL», c'est qu’elle est comprise par toutes les versions de l'interpréteur de la ligne de commande Windows. À son exécution, elle produit un code de retour de valeur «0», que l'on "retrouve dans" M1, et qu'on lit avec «%errorlevel%».

    On peut aussi utiliser «echo a | find "b">NUL» pour retourner «1» au lieu de «0».

    Enfin si tu souhaites avoir plus de possibilités numériques, tu peux faire appel à la commande «choice»
    ou encore «cmd /c exit /b valeur_de_retour».

    Comme tu le vois, les possibilités sont nombreuses.

    Espérant avoir répondu à ta question.

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Encore merci pour ce retour.

    Bon, il me reste encore une autre solution : utiliser une autre variable (aller, au hasard RC) pour récupérer le code retour, et laisser ERRORLEVEL au système.

    Merci encore.

  6. #6
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    En gros si je dois faire ceci :
    Code :
    
    set ERRORLEVEL=0
    dir /u (option inexistante)
    
    Comment puis-je récupérer le code retour 1 retourné par dir?
    voici un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @echo off
    
    echo:ERRORLEVEL=%errorlevel% [DIR]
    dir X:\ >nul 2>nul
    echo:ERRORLEVEL=%errorlevel% [DIR] 
    
    echo+|pause|echo+
    
    echo:ERRORLEVEL=%errorlevel% [XCOPY]
    XCopy >nul 2>nul
    echo:ERRORLEVEL=%errorlevel% [XCOPY]
    
    echo+|pause|echo+
    
    echo:ERRORLEVEL=%errorlevel% [CD]
    cd cheminInexistant 2>nul
    echo:ERRORLEVEL=%errorlevel% [CD]
    
    echo+|pause|echo+
    
    echo:ERRORLEVEL=%errorlevel% [SET]
    Set variableInexistante 2>nul
    echo:ERRORLEVEL=%errorlevel% [SET]
    
    pause

  7. #7
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Salut I'm_HERE, Salut fenrys_1,

    Citation Envoyé par fenrys_1 Voir le message
    Bon, il me reste encore une autre solution :
    Laquelle ?

    Parce que

    Citation Envoyé par fenrys_1 Voir le message
    utiliser une autre variable (aller, au hasard RC) pour récupérer le code retour
    tu en fais déjà allusion dans ton poste #3

    Citation Envoyé par fenrys_1 Voir le message
    Après chaque fonction je récupère le code retour, je l'évalue et le mets de côté dans une variable VAR par exemple.
    Toutefois, si ton problème est réglé, pense à marquer la discussion en [résolu].

    Bonne continuation sur le forum.

Discussions similaires

  1. Code de retour d'une commande
    Par Bruno21 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 23/08/2014, 07h55
  2. code de retour d'une commande
    Par palap dans le forum C
    Réponses: 3
    Dernier message: 09/07/2013, 22h24
  3. Récupérer retour d'une commande DOS ou scrit BATCH
    Par Robiwan87 dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 17/02/2011, 09h09
  4. Execution programme et récupération du code retour
    Par Dr_GonZO dans le forum Langage
    Réponses: 5
    Dernier message: 12/07/2005, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo