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 :

Gestion d'erreur XCOPY [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut Gestion d'erreur XCOPY
    Bonjour,

    j'ai un souci avec le script suivant :
    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
    26
    27
    28
    29
    30
    31
    @echo off
    cls
    
    ECHO. > log.txt
    
    :begin
    XCOPY /q /y a.txt \tmp\ > NUL
    CALL :check_xcopy ERRORLEVEL a.txt
    
    XCOPY /q /y ab.txt \tmp\ > NUL
    CALL :check_xcopy ERRORLEVEL ab.txt
    
    XCOPY /q /y fichier_qui_nexiste_pas.txt \tmp\ > NUL
    CALL :check_xcopy ERRORLEVEL fichier_qui_nexiste_pas.txt
    
    XCOPY /q /y abcd.txt \tmp\ > NUL
    CALL :check_xcopy ERRORLEVEL abcd.txt
    
    GOTO :end
    
    :check_xcopy
    ECHO. >> log.txt
    IF %1 0 ( ECHO %2 - erreur 0 - Fichier copié >> log.txt )
    IF %1 1 ( ECHO %2 - erreur 1 - Aucun fichier à copier n'a été trouvé >> log.txt )
    IF %1 2 ( ECHO %2 - erreur 2 - Opération annulée par l'utilisateur >> log.txt )
    IF %1 4 ( ECHO %2 - erreur 4 - Erreurs diverses comme manque de mémoire, espace disque insuffisant, nom de lecteur invalide ou syntaxe incorrecte >> log.txt )
    IF %1 5 ( ECHO %2 - erreur 5 - Une erreur d'écriture disque est survenue >> log.txt )
    GOTO :eof
    
    :end
    ECHO END >> log.txt
    1/ Pourquoi j'ai l'affichage sur écran :
    Fichier introuvable - fichier_qui_nexiste_pas.txt
    2/ D'après mon fichier log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a.txt - erreur 0 - Fichier copié  
     
    ab.txt - erreur 0 - Fichier copié  
     
    fichier_qui_nexiste_pas.txt - erreur 0 - Fichier copié  
    fichier_qui_nexiste_pas.txt - erreur 1 - Aucun fichier à copier n'a été trouvé  
    fichier_qui_nexiste_pas.txt - erreur 2 - Opération annulée par l'utilisateur  
    fichier_qui_nexiste_pas.txt - erreur 4 - Erreurs diverses comme manque de mémoire, espace disque insuffisant, nom de lecteur invalide ou syntaxe incorrecte  
     
    abcd.txt - erreur 0 - Fichier copié  
    END
    la fonction check_copy ne s'exécute pas correctement... la copie du fichier fichier_qui_nexiste_pas.txt provoque 4 erreurs !

    Merci d'avance pour votre aide !


  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Parce que ton errolevel n'est pas évalué si tu ne le mets pas entre "%" il reste donc égal `"errorlevel".


    essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL :check_xcopy %ERRORLEVEL% abcd.txt

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Merci sachadee !

    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
    26
    27
    28
    29
    30
    31
    32
    @echo off
    cls
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    ECHO. > log.txt
    
    :begin
    XCOPY /q /y a.txt \tmp\ > NUL
    CALL :check_xcopy %ERRORLEVEL% a.txt
    
    XCOPY /q /y ab.txt \tmp\ > NUL
    CALL :check_xcopy %ERRORLEVEL% ab.txt
    
    XCOPY /q /y fichier_qui_nexiste_pas.txt \tmp\ > NUL
    CALL :check_xcopy %ERRORLEVEL% fichier_qui_nexiste_pas.txt
    
    XCOPY /q /y abcd.txt \tmp\ > NUL
    CALL :check_xcopy %ERRORLEVEL% abcd.txt
    
    GOTO :end
    
    :check_xcopy
    ECHO. >> log.txt
    IF %1==0 ( ECHO %2 - erreur 0 - Fichier copié >> log.txt )
    IF %1==1 ( ECHO %2 - erreur 1 - Aucun fichier à copier n'a été trouvé >> log.txt )
    IF %1==2 ( ECHO %2 - erreur 2 - Opération annulée par l'utilisateur >> log.txt )
    IF %1==4 ( ECHO %2 - erreur 4 - Erreurs diverses comme manque de mémoire, espace disque insuffisant, nom de lecteur invalide ou syntaxe incorrecte >> log.txt )
    IF %1==5 ( ECHO %2 - erreur 5 - Une erreur d'écriture disque est survenue >> log.txt )
    GOTO :eof
    
    :end
    ECHO END >> log.txt
    semble fonctionner car j'obtiens bien (seulement) l'erreur 4 pour un fichier qui n'existe pas...

    par contre j'ai toujours l'affichage de :
    Fichier introuvable - fichier_qui_nexiste_pas.txt

  4. #4
    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
    Citation Envoyé par sachadee Voir le message
    Parce que ton errolevel n'est pas évalué
    salut sachadee et merci pour ton aide,

    si tu permets j'ai quelques remarques sur la question de l'evaluation, à vrai dire, elle est 'trop' évalué, 'ERRORLEVEL' est une sorte de compteur qui s'incremente d'un pas jusqu'au code de retour retourner par la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XCOPY 8: 9: >NUL 2>&1
    echo %%ERRORLEVEL%%: %ERRORLEVEL%
    PAUSE
    FOR /L %%A in (0 1 %ERRORLEVEL%) DO IF ERRORLEVEL %%A ECHO ERRORLEVEL: %%A
    --------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %ERRORLEVEL%: 4
    Appuyez sur une touche pour continuer...
    ERRORLEVEL: 0
    ERRORLEVEL: 1
    ERRORLEVEL: 2
    ERRORLEVEL: 3
    ERRORLEVEL: 4
    le comportement d'ERRORLEVEL sera different s'il s'agit d'un nombre negatif, 'ERRORLEVEL' va afficher uniquement le code de retour et non pas une plage de nombre 'n'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd /c exit /b -9
    for /l %%a in (0 -1 %ERRORLEVEL%) do if errorlevel %%a echo %%a
    si on initialise une variable du nom 'ERRORLEVEL', ERRORLEVEL sera égal à '0' (donc pas d'erreur et c'est logique car "SET ERRORLEVEL=n" est une commande valide) mais %ERRORLEVEL% sera égale au contenu de la variable qu'on a initialiser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set errorlevel=34
    echo %%ERRORLEVEL%%: %ERRORLEVEL%
    if ERRORLEVEL %ERRORLEVEL% ECHO ERRORLEVEL: 34
    if ERRORLEVEL 0 ECHO ERRORLEVEL: 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -----
    %ERRORLEVEL%: 34
    ERRORLEVEL: 0
    et ceci jusqu'a ce qu'on reinitiliase notre environement , ou on change de nouveau le contenu de notre variable 'SET ERRORLEVEL'.
    'ERRORLEVEL' aura un comportement different si un autre code de retour sera levé par une autre commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set errorlevel=34
    echo %%ERRORLEVEL%%: %ERRORLEVEL%
    if ERRORLEVEL %ERRORLEVEL% ECHO ERRORLEVEL: 34
    PAUSE
    xcopy 8: 7: >nul 2>&1
    echo %%ERRORLEVEL%%: %ERRORLEVEL%
    FOR /L %%A in (0 1 10) DO IF ERRORLEVEL %%A ECHO ERRORLEVEL: %%A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ------
    %ERRORLEVEL%: 34
    Appuyez sur une touche pour continuer...
    %ERRORLEVEL%: 34
    ERRORLEVEL: 0
    ERRORLEVEL: 1
    ERRORLEVEL: 2
    ERRORLEVEL: 3
    ERRORLEVEL: 4
    on a deux mechanisme de capture des codes de retours, le premier étant la variable %ERRORLEVEL% qui va stocker le code de retour des commandes puis va être evalué dans le parsetime, un bug de conception cependant, %=ERRORLEVEL% était peux être un choix plus fiable que %ERRORLEVEL%, pour rendre la variable en mode Read-Only.
    le deuxieme etant 'ERRORLEVEL' qui va être executer dans le runtime independemment de la variable %ERRORLEVEL%.

    tous les tests sont sous un xpsp2.

    merci encore pour ton aide

  5. #5
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Merci I'm Here,

    pour cette superbe explication sur l'errorlevel.

    Citation Envoyé par I'm_HERE Voir le message
    si tu permets j'ai quelques remarques sur la question de l'evaluation, à vrai dire, elle est 'trop' évalué
    Je me référais dans ce cas au :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL :check_xcopy ERRORLEVEL a.txt
    qui était dans le cas de notre ami évalué comme un string "errorlevel"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >echo "%1"
    >"errorlevel"
    et non comme la représentation évaluée de l'errorlevel en cours de traitement,
    dont il a besoin, en réalité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL :check_xcopy %ERRORLEVEL% a.txt
    Là, je ne pense pas que l'on puisse parlé de surévaluation mais bien de non évaluation (par le Call).

    Néanmoins il était important de souligner la différence d'évaluation entre %errorlevel% et errorlevel ce dernier devant être utilisé comme condition dans un test "IF" et ne peut pas être appelé tel quel comme argument d'un "Call" où il sera interprété comme un simple string.

    Dans tous les cas la fiabilité du errorlevel par rapport au %errorlevel% est indiscutable.

    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
    >echo %errorlevel%
    >0
    >
    >set errorlevel=%%errorlevel%%
    >
    >echo %errorlevel%
    >%0%
    >
    >Xcopy :x
    File not found - x
    0 file(s) copied
    >
    >echo %errorlevel%
    >%0%
    >
    >if errorlevel 4 echo OK
    >OK
    >
    >set errorlevel=
    >
    >echo %errorlevel%
    >4
    Encore merci à toi I'm Here.


  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Merci à vous 2 d'avoir pris le temps de m'aider...
    J'ai pas tout imprimé mais j'ai compris mon erreur. Maintenant ça marche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion d'erreur et de transactions....
    Par Dge dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2006, 22h20
  2. [Struts-Validator] Gestion d'erreurs
    Par sylvain_neus dans le forum Struts 1
    Réponses: 14
    Dernier message: 09/04/2004, 15h15
  3. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  4. [LG]tests pour la gestion d'erreur
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2003, 20h44
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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