Bonjour,

J'utilisais auparavant Cobian Backup pour la gestion de mes sauvagardes, mais il lui manque la gestion de reconnexion automatique lorsque, il y a une perte de connexion.
Je me suis dit que j'allais testé un peu en batch ce que cela pouvait donné.

Pour info les fichiers que j'envois représente plusieurs milliers de fichiers .txt et autres qui sont en réalité des bases de données. Cela représente 500Go de données environ.

1) Pourriez vous me conseillé sur le bon choix des options choisit et surtout sur les temps à configurer, ou s'il vaut mieux laissé les temps par défaut.
2) Je voudrais également en savoir plus sur la gestion des erreurs sur les fichiers non envoyé, savoir comment géré cela, les contrôles à faire.
3) Lorsque j ajoute un répertoire avec une longue arborescence, ou sans doute un fichier trop long, le script plante sans retour d'erreur, il faut que je creuse avec l'option --traceascii


Voici mon petit batch de test pour la gestion d'envois de fichier sur un ftp distant.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
 
@echo off
chcp 28591 > nul
 
title %0 Script & Color 1A
 
setlocal enableextensions enabledelayedexpansion
 
 
set "FUNCTIONS_FILE=%~dp0..\5-Communs\Scripts\Functions.bat"
set "FTP_SEND_LOG=%~dp0..\6-Logs\FtpSend.log"
set "FTP_ERROR_LOG=%~dp0..\6-Logs\FtpError.log"
 
REM Variable de connection FTP
set "FTP_USER=backup"
set "FTP_PWD=backupxxxx"
set "FTP_IP=78.227.13.123"
set "FTP_PORT=21021"
set "FTP_INITIAL_DIRECTORY=/TEST/SCRIPTS/%username%/"
Rem DOSSIER LOCAL A TRANSFERER
set "FTP_FILE_TRANSFERT=D:\test\"
 
 
 
REM Variable de configuration du FTP
REM Permet de supprimer les information du shell (error + progresse bar)
set "SILENT_MODE=0"
Rem Durée maximale en secondes que vous autorisez à prendre toute l'opération
set /a MAX_TIME=3600*24*7
Rem Durée maximale en secondes que vous autorisez à prendre pour la connexion au serveur distant 
set /a CONNECT_TIMEOUT=3600*24*1
Rem Nombre de tentative de connexion au serveur distant
set /a RETRY=50
Rem Durée en secondes entre chaque des tentatives de connexion au serveur distant
set /a RETRY_DELAY=5
Rem Durée maximale en secondes des tentatives de connexion au serveur distant soit (50 tentatives * 5 secondes * 2 car environ 2s de test)
set /a RETRY_MAX_TIME=50*5*2
Rem Pour limiter la vitesse de transmition en Mo/s (en général le client à une connexion de 900 Mo/s en upload (1000* pour mettre en Mo/s)
set /a LIMIT_RATE=1000*2000
 
 
 
 
REM Détection des répertoires et du choix des applications pour les version 32 bits ou 64 bits
if "%processor_architecture%" equ "AMD64" (
	set "CURL=%~dp0..\5-Communs\Bin\Curl\curl-7.61.1_6-win64-mingw\bin\curl.exe"
) else (
	set "CURL=%~dp0..\5-Communs\Bin\Curl\curl-7.61.1_6-win32-mingw\bin\curl.exe"
)
 
 
 
 
call :ftpSendFiles "%FTP_INITIAL_DIRECTORY%" "%FTP_FILE_TRANSFERT%"
 
 
 
 
exit
 
 
 
 
 
:ftpSendFiles
Rem Initialisation du fichier de log
call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "=====================================[%date% %time:~0,2%h%time:~3,2%%time:~5,3%]====================================="
 
set "FTP_INITIAL_DIRECTORY=%1"
set FTP_INITIAL_DIRECTORY=!FTP_INITIAL_DIRECTORY:"=!
 
set "FTP_FILE_TRANSFERT=%2"
set FTP_FILE_TRANSFERT=!FTP_FILE_TRANSFERT:"=!
 
echo FTP_FILE_TRANSFERT: !FTP_FILE_TRANSFERT!
echo FTP_INITIAL_DIRECTORY: !FTP_INITIAL_DIRECTORY!
 
 
if "%SILENT_MODE%" equ "0" ( 
	set "SILENT="
	set "SHOW_ERROR_MODE="
) else ( 
	set "SILENT=--silent "
	set "SHOW_ERROR_MODE=--show-error "
)
Rem --silent              Permet de supprimer la barre de progression et les erreurs
Rem --show-error          Permet l'affichage des erreurs et aussi retourner un code erreurlevel 
Rem --fail                Permet de retourner un code erreur > 0
Rem --connect-timeout     Durée maximale en secondes que vous autorisez à prendre la connexion de curl
Rem --max-time            Durée maximale en secondes que vous autorisez à prendre toute l'opération
Rem --retry-connrefused   Permet de considérez ECONNREFUSED comme une erreur
Rem --retry-delay         Durée en secondes à laquel sera relancée la connexion 
Rem --retry               Permet de relancer la connexion sur une erreur transitoire X fois
Rem --fail-early          Échec et sortie sur la première erreur de transfert détectée
Rem --ftp-create-dirs     Permet de créer des répertoires manquants
Rem --trace <file>        Active un dump de trace complet de toutes les données entrantes et sortantes, y compris les informations descriptives, dans le fichier de sortie donné. 
Rem --trace <file>        Utilisez "-" comme nom de fichier pour que la sortie soit envoyée à stdout. Utilisez "%" comme nom de fichier pour que la sortie soit envoyée à stderr. 
Rem --limit-rate          Permet delimiter le transfert en MB (il faudrait faire untest de bande passante pour transferer à 50% du débit du client
Rem --remote-name, -O     curl -u ftpuser:ftppass -O ftp://ftp_server/dossier/
Rem --upload-file, -T      "{fichier1,fichier2}" pour plusieurs fichier.
 
 
rem  On met dans une variable OPTION toute les options de curl
set "OPTION=%SILENT%%SHOW_ERROR_MODE%--fail --limit-rate %LIMIT_RATE% --connect-timeout %CONNECT_TIMEOUT% --max-time %MAX_TIME% --retry-connrefused --retry-delay %RETRY_DELAY% --retry-max-time %RETRY_MAX_TIME% --retry %RETRY% --fail-early --ftp-create-dirs"
 
 
 
set FILE_TO_SEND=""
Rem lister les fichiers au format fichier1, fichier2, fichier3
for /R "%FTP_FILE_TRANSFERT%" %%a in ("*.*") do (
	set "FILE=%%a"
	Rem Pour curl on modifie les répertoires avec un double \\ c:\\test\\fichier1.txt
	set FILE=!FILE:\=\\!
	if "!FILES_TO_SEND!" equ "" ( 
		set "FILES_TO_SEND=!FILE!" 
	) else ( 
		set "FILES_TO_SEND=!FILES_TO_SEND!,!FILE!"
	)
)
 
rem https://stackoverflow.com/questions/936108/how-to-script-ftp-upload-and-download
 
 
if exist "%FTP_FILE_TRANSFERT%*.*" (
		echo This rep exist: %FTP_FILE_TRANSFERT%
		rem  [!FILES_TO_SEND!]
		REM Envoi de chaque fichier sur le ftp
		"%CURL%" %OPTION% -u "%FTP_USER%:%FTP_PWD%" -T "{!FILES_TO_SEND!}" "ftp://%FTP_IP%:%FTP_PORT%/%FTP_INITIAL_DIRECTORY%"
		set "EXITCODE=!ERRORLEVEL!"
		if "!EXITCODE!" equ "0" (
			Rem On logue les infos dans un fichier
			call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "[%date% %time:~0,2%h%time:~3,2%%time:~5,3%] - [Status: ENVOYE] - Le(s) fichier(s) "!FILES_TO_SEND!" a été envoyé "	
		) else ( 
			call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%" "[%date% %time:~0,2%h%time:~3,2%%time:~5,3%] - [Status: ERROR(!EXITCODE!)] - Les fichiers "!FILES_TO_SEND!" n'a pas été envoyé "
		)	
)
 
 
call "%FUNCTIONS_FILE%" inLogFile "%FTP_SEND_LOG%"
pause
goto :eof