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 :

IF condition en train de casser mon batch [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut IF condition en train de casser mon batch
    Bonjour,

    Je suis en train de développer un batch qui doit faire l'envoie d'un fichier via ftp.

    Le batch essaye de faire l'envoie et regarde ensuite les logs pour voir s'il a été réussi. Si ce n'est pas le cas, il va réessayer. Pas de soucis jusqu'à là.

    Mon problème commence lorsque je rajoute une vérification pour voir si le fichier est vide. Dans ce cas, le batch plante et semble ne pas s'exécuter (aucun log, la fenêtre DOS ouvre et ferme rapidement).

    Voici mes deux batchs :
    Celui qui marche:
    Code batch : 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
    @echo off
     
    :: Definition des variables
    set basePath=D:\****************\mustt\rec
    set zipFile=%basePath%\DATA\GP05
    set csvFile=%basePath%\DATA\utilisateurs.csv
    set logFile=%basePath%\LOG\GP05.LOG
    set /A nbExec=0
     
     
    	:: Suppression du fichier zip précedent
    	del %zipFile%.zip
     
    	:: Création du fichier zip
    	"C:\Program Files\7-Zip\7z" a -tzip %zipFile% %csvFile% >> %logFile%
     
    	:: Début de la boucle ftp
    	:ftpTransfer
     
    	:: Transfert ftp
    	set /A nbExec=%nbExec%+1
    	echo (%nbExec%) %date% - %time% >> %logFile%
     
    	ftp -s:%basePath%\FTPCommandGP05-rec.txt >> %logFile%
     
    	:: Lecture des logs ftp
    	setlocal EnableDelayedExpansion
    	set /A firstTail=1, lastTail=0
    	for /F "delims=" %%a in (%logFile%) do (
    	   set /A lastTail+=1, lines=lastTail-firstTail+1
    	   set "lastLine[!lastTail!]=%%a"
    	   if !lines! gtr 10 (
    		  set "lastLine[!firstTail!]="
    		  set /A firstTail+=1
    	   )
    	)
     
    	:: Vérification de réussite
    	set /A TRANSFER_OK=0
    	for /L %%i in (%firstTail%,1,%lastTail%) do (
    		if "!lastLine[%%i]!" == "200 Data port accepted" set /A TRANSFER_OK=1
    	)
     
    	if %TRANSFER_OK% == 0 echo Echec lors de la transmission (%nbExec%) >> %logFile%
    	if %TRANSFER_OK% == 1 echo Transmission (%nbExec%) réussi >> %logFile%
     
    	set /A endBoucle=0
    	if %TRANSFER_OK% == 1 set /A endBoucle=1
    	if %nbExec% == 5 set /A endBoucle=1
     
    	if %endBoucle%==0 (
    		timeout /t 300
    		goto ftpTransfer
    	)
     
    	echo Fin de la transmission >> %logFile%

    Celui que ne marche pas, où j'ai rajouté une condition IF :
    Code batch : 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
    @echo off
    
    :: Definition des variables
    set basePath=D:\****************\mustt\rec
    set zipFile=%basePath%\DATA\GP05
    set csvFile=%basePath%\DATA\utilisateurs.csv
    set logFile=%basePath%\LOG\GP05.LOG
    set /A nbExec=0
    
    :: Get the number of lines in the file
    set /A LINES=0
    for /f "delims==" %%I in (%csvFile%) do (
        set LINES=LINES+1
    )
    
    if %LINES% GTR 0 (   
    
    	:: Suppression du fichier zip précedent
    	del %zipFile%.zip
    
    	:: Création du fichier zip
    	"C:\Program Files\7-Zip\7z" a -tzip %zipFile% %csvFile% >> %logFile%
    
    	:: Début de la boucle ftp
    	:ftpTransfer
    
    	:: Transfert ftp
    	set /A nbExec=%nbExec%+1
    	echo (%nbExec%) %date% - %time% >> %logFile%
    
    	ftp -s:%basePath%\FTPCommandGP05-rec.txt >> %logFile%
    	
    	:: Lecture des logs ftp
    	setlocal EnableDelayedExpansion
    	set /A firstTail=1, lastTail=0
    	for /F "delims=" %%a in (%logFile%) do (
    	   set /A lastTail+=1, lines=lastTail-firstTail+1
    	   set "lastLine[!lastTail!]=%%a"
    	   if !lines! gtr 10 (
    		  set "lastLine[!firstTail!]="
    		  set /A firstTail+=1
    	   )
    	)
    
    	:: Vérification de réussite
    	set /A TRANSFER_OK=0
    	for /L %%i in (%firstTail%,1,%lastTail%) do (
    		if "!lastLine[%%i]!" == "200 Data port accepted" set /A TRANSFER_OK=1
    	)
    
    	if %TRANSFER_OK% == 0 echo Echec lors de la transmission (%nbExec%) >> %logFile%
    	if %TRANSFER_OK% == 1 echo Transmission (%nbExec%) réussi >> %logFile%
    
    	set /A endBoucle=0
    	if %TRANSFER_OK% == 1 set /A endBoucle=1
    	if %nbExec% == 5 set /A endBoucle=1
    
    	if %endBoucle%==0 (
    		timeout /t 300
    		goto ftpTransfer
    	)
    
    	echo Fin de la transmission >> %logFile%
    	
    	
    ) else ( echo "FILE HAS NOT BEEN SENT" >> %logFile%)
    pause

    Le code entre les "()" de mon IF est exactement le même que dans ça version "que marche", et si je remplace le code pour quelque chose d'autre il marche bien aussi :
    Code batch : 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
    @echo off
     
    :: Definition des variables
    set basePath=D:\****************\mustt\rec
    set zipFile=%basePath%\DATA\GP05
    set csvFile=%basePath%\DATA\utilisateurs.csv
    set logFile=%basePath%\LOG\GP05.LOG
    set /A nbExec=0
     
    :: Get the number of lines in the file
    set /A LINES=0
    for /f "delims==" %%I in (%csvFile%) do (
        set LINES=LINES+1
    )
     
    if %LINES% GTR 0 (   
     
     
     
    	echo Fin de la transmission >> %logFile%
     
     
    ) else ( echo "FILE HAS NOT BEEN SENT" >> %logFile%)
    pause

    Ce code marche.

    Avez-vous une idée de ce qui peut planter ?

    Je vous remercie d'avance par votre aide,
    Marc

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Bonjour,

    J'ai trouvé la solution, en effet il a fallu déplacer le code de la boucle en dehors du IF, apparentement il ne gère pas bien les boucles dans les IFs:

    Code batch : 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
    @echo off
     
    :: Definition des variables
    set basePath=D:\******************\mustt\rec
    set commandFile=%basePath%\FTPCommandGP05-rec.txt
    set zipFile=%basePath%\DATA\GP05
    set csvFile=%basePath%\DATA\utilisateurs.csv
    set logFile=%basePath%\LOG\GP05.LOG
    set /A nbExec=0
     
    :: Get the number of lines in the file
    set /A LINES=0
    for /f "delims==" %%I in (%csvFile%) do (
        set LINES=LINES+1
    )
     
    if %LINES% GTR 2 (   
     
    	:: Suppression du fichier zip précedent
    	del %zipFile%.zip
     
    	:: Création du fichier zip
    	"C:\Program Files\7-Zip\7z" a -tzip %zipFile% %csvFile% >> %logFile%
     
    	:: Début de la boucle ftp
    	goto ftpTransfer
     
     
    ) else (
    	echo "FILE HAS NOT BEEN SENT" >> %logFile%
    	goto endBatch
    )
     
     
    :ftpTransfer
     
    :: Transfert ftp
    set /A nbExec=%nbExec%+1
    echo (%nbExec%) %date% - %time% >> %logFile%
     
    ftp -s:%commandFile% >> %logFile%
     
    :: Lecture des logs ftp
    setlocal EnableDelayedExpansion
    set /A firstTail=1, lastTail=0
    for /F "delims=" %%a in (%logFile%) do (
       set /A lastTail+=1, lines=lastTail-firstTail+1
       set "lastLine[!lastTail!]=%%a"
       if !lines! gtr 10 (
    	  set "lastLine[!firstTail!]="
    	  set /A firstTail+=1
       )
    )
     
    :: Vérification de réussite
    set /A TRANSFER_OK=0
    for /L %%i in (%firstTail%,1,%lastTail%) do (
    	if "!lastLine[%%i]!" == "200 Data port accepted" set /A TRANSFER_OK=1
    )
     
    if %TRANSFER_OK% == 0 echo Echec lors de la transmission (%nbExec%) >> %logFile%
    if %TRANSFER_OK% == 1 echo Transmission (%nbExec%) réussi >> %logFile%
     
    set /A endBoucle=0
    if %TRANSFER_OK% == 1 set /A endBoucle=1
    if %nbExec% == 5 set /A endBoucle=1
     
    if %endBoucle%==0 (
    	timeout /t 300
    	goto ftpTransfer
    )
     
    echo Fin de la transmission >> %logFile%
     
    :endBatch

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/02/2009, 15h27
  2. Réponses: 0
    Dernier message: 06/10/2007, 09h49
  3. Réponses: 2
    Dernier message: 12/09/2007, 22h42
  4. Marche seulement sans fonction
    Par swissmade dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2007, 12h48
  5. Réponses: 10
    Dernier message: 02/10/2006, 13h36

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