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
Partager