Sous Windows, on peut automatiser la réception de fichiers par FTP dans un fichier batch. La solution que je propose utilise la commande FTP native de Windows, et gère les erreurs de transmission. Le script FTP_GET.BAT a été testé sous Windows XP Professionnal et sous Windows Vista.
Fichier batch FTP_GET.BAT :
@echo off
rem ---------------------------------------------------------------------------
rem - BATCH : FTP_GET.BAT
rem - ROLE : RECEVOIR DES FICHIERS PAR FTP
rem - VERSION : 1.1 du 06-06-2009
rem - HOME PAGE : http://www.montpellier-informatique.com/
rem ---------------------------------------------------------------------------
rem -
rem - PARAMETRES :
rem - Serveur FTP source
rem - User
rem - Password
rem - Mode: asci/bin
rem - Chemin du dossier source (sur le serveur)
rem - Chemin du dossier cible (local)
rem - masque des fichiers à recevoir
rem -
rem - VALEUR DE RETOUR :
rem - RETVAL = 0 si OK, ou 1 sur erreur
rem ----------------------------------------------------------------------------
set v_FTP_ADR=%1
set v_FTP_USR=%2
set v_FTP_PWD=%3
set v_FTP_MODE=%4
set v_REP_SRC=%5
set v_REP_DEST=%6
set v_FIC_SRC=%7
set v_REP_TMP=%TMP%
set v_FIC_CMD=%v_REP_TMP%\FTP_GET_%RANDOM%.tmp
set v_FIC_RES=%v_REP_TMP%\FTP_GET_%RANDOM%.tmp
rem ----------------------------------------------------------------------------
echo %0 %*
rem ----------------------------------------------------------------------------
echo open %v_FTP_ADR% > %v_FIC_CMD%
echo user %v_FTP_USR% %v_FTP_PWD% >> %v_FIC_CMD%
echo %v_FTP_MODE% >> %v_FIC_CMD%
echo cd %v_REP_SRC% >> %v_FIC_CMD%
echo lcd %v_REP_DEST% >> %v_FIC_CMD%
echo mget %v_FIC_SRC% >> %v_FIC_CMD%
echo by >> %v_FIC_CMD%
FTP.EXE -i -n -v < %v_FIC_CMD% > %v_FIC_RES%
FIND "Transfer complete" %v_FIC_RES% >NUL
IF NOT ERRORLEVEL 1 GOTO :SUITE
GOTO :ERR_BATCH
rem ----------------------------------------------------------------------------
rem - Suppression des fichiers temporaires
rem ----------------------------------------------------------------------------
:SUITE
del %v_FIC_CMD%
del %v_FIC_RES%
SET RETVAL=0
GOTO :FIN_BATCH
rem ----------------------------------------------------------------------------
rem - Gestion des erreurs
rem ----------------------------------------------------------------------------
:ERR_BATCH
echo Erreur a la reception des fichiers %v_REP_SRC%\%v_FIC_SRC%
type %v_FIC_RES%
SET RETVAL=1
:FIN_BATCH
Utilisation du script FTP_GET.BAT
Il faut lui passer les arguments suivants:
- Serveur FTP source; exemple: ftp.myhost.com
- Utilisateur (ftp username); exemple: dupont
- Mot de passe (ftp password); exemple: xxxxx
- Mode de transmission: "bin" ou "ascii"
- Chemin du dossier source (sur le serveur ftp); exemple: /public
- Chemin du dossier cible (path local qui contient le fichier à recevoir); exemple: C:\download
- Fichier(s) à recevoir: le nom d'un fichier, ou le masque des fichiers à recevoir. Le ou les fichiers spécifiés sont contenus dans le dossier donné en argument 5. Exemples: myfile.xml ou myfile*.*
Exemple d'utilisation à la ligne de commande:
C:\> FTP_GET.BAT ftp.myhost.com dupont xxxxx bin /public C:\download myfile.xml
reçoit le fichier /public/myfile.xml du serveur ftp.myhost.com, en mode binaire, dans le répertoire local C:\download
Exemple d'utilisation dans un fichier batch:
Quand on appelle FTP_GET.BAT dans un fichier batch, il est utile de vérifier que le transfert s'est déroulé sans erreurs avant de continuer les traitements. On le fait très simplement en testant la valeur de la variable d'environnement RETVAL, qui est mise à jour par FTP_GET en sortie:
- si RETVAL = 0 : transfert a réussi
- si RETVAL = 1 : le transfert a échoué
set SRCDIR=/public
set TRG=C:\download
set FTPHOST=ftp.myhost.com
set FTPUSR=dupont
set FTPASS=xxxxx
:STEP1
set FILE=myfile1.xml
call FTP_GET.BAT %FTPHOST% %FTPUSR% %FTPASS% bin %SRCDIR% %TRG% %FILE%
if %RETVAL% EQU 0 GOTO STEP2
echo Echec de la reception du fichier %FILE%
pause
:STEP2
set FILE=myfile2.xml
call FTP_GET.BAT %FTPHOST% %FTPUSR% %FTPASS% bin %SRCDIR% %TRG% %FILE%
if %RETVAL% EQU 0 GOTO STEP3
echo Echec de la reception du fichier %FILE%
pause
:STEP3
rem suite du traitement...
Pour faire l'opération inverse, lire Envoyer un fichier par FTP dans un fichier batch de Windows