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 :

ERRORLEVEL dans boucle FOR [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut ERRORLEVEL dans boucle FOR
    Bonjour,

    J'ai un problème que je n'arrive pas à résoudre sur un script que je suis entrain de faire.
    Le but de ce script est d'archiver automatiquement une source vers une destination à l'aide de winrar.
    Voici mon script:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    @echo off
    @title /!\ Archivage automatique /!\
    
    rem Effacement du shell courant:
    cls
    
    :variables
    rem Localisation du repertoure courant:
    set REPCOURANT=%~dp0
    rem Localisation du repertoire WINRAR:
    set REPWINRAR="C:\Program Files\WinRAR\"
    rem Date du jour au format "YYYYMMJJ":
    set DATEduJOUR=%date:~6,4%%date:~3,2%%date:~0,2%
    rem Heure du jour:
    set HEUREduJOUR=%time:~0,2%%time:~3,2%%time:~6,2%
    rem Localisation du fichier contenant les sources et destinations:
    set REPDATA="D:\ABC\Projets\Scripting\Archivage_automatique\"
    rem Nom du fichier qui contient les donnees sur les sauvegardes:
    set FILEDATA=data.csv
    rem Concatenation de REPDATA et FILEDATA:
    set DATA=%REPDATA%%FILEDATA%
    rem Format du fichier de log:
    set FORMATLOG=%DATEduJOUR%
    rem Destination fichier de log:
    set DESTLOG="D:\test_archiv\"
    rem Redirection simple vers fichier de logs:
    set REDIRLOG=%DESTLOG%history_%FORMATLOG%.txt
    rem Choix d'un taux de compression :
    set TAUXdeCOMP=5
    	rem 0: Stocke : Ajoute les fichiers à archiver sans compression 
    	rem 1: La plus rapide: faible compression
    	rem 2: Rapide : Méthode de compression rapide
    	rem 3: Normale : Méthode de compression normale (par défaut)
    	rem 4: Bonne : Méthode de compression bonne (plus de compression)
    	rem 5: Meilleure : Meilleure méthode de compression (plus de compression mais plus lente)
    rem Localisation du logiciel sendmail.exe (envoi de mail):
    set REPSENDMAIL=%REPCOURANT%sources\
    rem Serveur SMTP:
    set SRVSMTP=srv-exch.****.local
    rem Destinataire mail
    set DESTMAIL=administrateur@****.local
    	
    rem Création du fichier de log avec horodatage:
    echo. >> %REDIRLOG%
    echo ############ Demarrage de l'archivage: %date% - %time% ############ >>%REDIRLOG%
    echo. >> %REDIRLOG%
    
    rem Test de presence du fichier de donnees:
    if not exist %DATA% goto :fin_prematuree1 
    
    rem Recuperation des destinations, sources et noms des sauvegardes:
    for /f "tokens=1,2,3,4 delims=," %%a IN ('type %DATA%') DO (
    
    rem Envoi informations au fichier de log:
    echo. >> %REDIRLOG%
    echo ------ Archivage du repertoire [%%c] vers [%%b%%d] ------ >>%REDIRLOG%
    
    rem Lancement de la commande d'archivage:
    %REPWINRAR%Rar.exe a -t -r -as -s -m%TAUXdeCOMP% %%b%%d %%c  2>>%REDIRLOG% 
    rem Si  erreur, on envoi message dans log:
    if errorlevel 1 echo [NOK] Des erreurs ont ete detectee >>%REDIRLOG%
    rem Si aucune erreur, on envoi message dans log:
    if errorlevel 0 echo [OK] Aucune erreur n'a ete detectee >>%REDIRLOG%
    
    REM | rmdir %%c /q /s 
    )
    goto :fin
    
    rem Fin du programme:
    :fin
    echo. >> %REDIRLOG%
    echo ############ Fin de l'archivage: %date% - %time% ############ >>%REDIRLOG%
    echo. >> %REDIRLOG%
    rem Envoi d'un mail a l'administrateur:
    %REPSENDMAIL%sendEmail.exe -s %SRVSMTP% -f administrateur@%COMPUTERNAME% -t %DESTMAIL% -u "Recapitulatif archivage" < %REDIRLOG%
    pause
    exit
    
    rem Fin du programme en cas d'erreur:
    :fin_prematuree1
    echo. >> %REDIRLOG%
    echo [ERREUR] Le fichier %DATA% n'existe pas ! >>%REDIRLOG%
    echo. >> %REDIRLOG%
    exit
    Ce que je souhaite faire dans la boucle FOR, après l'exécution de la commande winrar, c'est d'envoyer un message spécifique dans un fichier de log selon le niveau d'erreur de la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rem Lancement de la commande d'archivage:
    %REPWINRAR%Rar.exe a -t -r -as -s -m%TAUXdeCOMP% %%b%%d %%c  2>>%REDIRLOG% 
    rem Si  erreur, on envoi message dans log NOK:
    if errorlevel 1 echo [NOK] Des erreurs ont ete detectee >>%REDIRLOG%
    rem Si aucune erreur, on envoi message dans log OK:
    if errorlevel 0 echo [OK] Aucune erreur n'a ete detectee >>%REDIRLOG%
    Mon problème est que quand la commande winrar s'exécute correctement, donc errorlevel à 0, il m'envoi bien dans mon fichier de log [OK] ...
    Mais si la commande rencontre une erreur, donc je suppose que c'est un errorlevel à 1, il m'envoi les deux messages [OK]... et [NOK] ...
    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
    ############ Demarrage de l'archivage: 17/11/2014 - 10:35:08,07 ############ 
     
     
    ------ Archivage du repertoire [D:\ABC\ENI] vers [D:\test_archiv\ENI] ------ [OK] Aucune erreur n'a ete detectee 
     
    ------ Archivage du repertoire [D:\ABC\Applications] vers [D:\test_archiv\Applications] ------ [OK] Aucune erreur n'a ete detectee 
     
    ------ Archivage du repertoire [D:\ABC\Messagerie] vers [D:\test_archiv\Messagerie] ------ 
    
    Impossible d'ouvrir D:\ABC\Messagerie\Outlook\Outlook.pst
    Le processus ne peut pas acc‚der au fichier car ce fichier est utilis‚ par un autre processus.
    Impossible d'ouvrir D:\ABC\Messagerie\Outlook\~Outlook.pst.tmp
    Le processus ne peut pas acc‚der au fichier car ce fichier est utilis‚ par un autre processus.[NOK] Des erreurs ont ete detectee [OK] Aucune erreur n'a ete detectee 
     
    ############ Fin de l'archivage: 17/11/2014 - 10:35:45,22 ############
    Auriez-vous des idées ?
    En espérant avoir été clair !

    Cordialement,
    Benjamin

  2. #2
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    ErrorLevel renvoi toujours le code de la dernière commande exécutée.

    Dans ton cas le ErrorLevel testé à la ligne 6 est le résultat de la commande Echo exécuté à la ligne 4

    Ici il faudfrait utiliser la clause ELSE dans une même instruction IF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Errorlevel 1 (
    Echo [NOK] >>%REDIRLOG%
    ) ELSE (
    Echo [OK] >>%REDIRLOG%
    )

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Bonjour et merci, c'est ce que je voulais !
    J'avais testé avec le else mais j'avais dû me tromper dans la syntaxe

    Je clos le sujet.

    Cordialement,
    Benjamin

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/09/2006, 19h08
  2. [débutant] Pb dans boucle For
    Par Sam 069 dans le forum Access
    Réponses: 2
    Dernier message: 11/09/2006, 13h10
  3. Réponses: 3
    Dernier message: 04/08/2006, 19h24
  4. problème dans boucle for de lecture de fichier ini
    Par chourmo dans le forum Delphi
    Réponses: 3
    Dernier message: 06/07/2006, 09h31
  5. [JLabel] JLabel dans boucle for
    Par clairenes dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/01/2006, 00h47

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