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