Windows batch Automatiser le transfert par FTP

Ce mémo a pour objectif d'expliquer comment automatiser le transfert d'un fichier par FTP. Pratique lors de la création de passerelles.

Prérequis: un serveur FTP. Le compte FTP utilisé est chrooté dans le dossier dans lequel doivent être déposés les fichiers. Pour créer le serveur FTP, ce billet donne la solution.

Pour le moment, on va faire un truc simplissime:

Je crée 3 fichiers scriptFTP.jpeg

  • script.bat est le script qui lancera le transfert. Il sera mis en tâches planifiées (pour ça, je vous laisse trouver comment on fait)
  • plannings_Extranet.ftp est la liste de commandes à éxécuter en FTP pour basculer les fichiers vers le repertoire FTP. Vous l'avez compris, la petite passerelle que je suis en train de faire a pour but de basculer les planings sur notre extranet.
  • Plop.txt est le fichier qui sera transféré; C'est juste pour le test hein!

script.bat

Il contient juste une ligne pour le moment.

ftp -s:planings_Extranet.ftp

Il lance le client dos ftp, qui prendra la liste d'instructions contenues dans le fichier planings_Extranet.ftp

planings_Extranet.ftp

open 192.168.10.253
user
password
prompt
lcd D:\testFtp
put plop.txt
quit

Explication ligne par ligne:

  • 1 Ouvrir la connexion vers le serveur 192.168.10.253
  • 2 Lui indiquer l'user FTP
  • 3 Lui indiquer le mot de passe ftp
  • 4 Attendre le prompt
  • 5 Se placer localement dans le repertoire comprenant le(s) fichiers à transférer
  • 6 envoyer le fichier
  • 7 fermer la connexion

plop.txt

Bah, c'est le fichier à transférer; OSEF?

Lancez script.bat, vérifiez sur le serveur de destination si le fichier a bien été poussé.

Un peu plus compliqué; On va pousser tous les fichiers d'un répertoire et créer un fichier de logs.

Prérequis, télécharger curl

Pour se simplifier un peu la vie, cette fois, on va utiliser curl. Téléchargez l'éxécutable qui correspond à votre version de windows: http://curl.haxx.se/download.html Je me créé l'architecture suivante sur le windows;

  • testFtp
    • script.bat
    • bin
      • curl.exe
      • license_curl.txt
    • toSend
      • fichier1.pdf
      • fichier2.pdf
      • fichier3.pdf

l'objectif est d'envoyer les fichiers (quelque soient leur noms) du dossier toSend sur notre ftp. Par contre si le fichier existe déja sur le serveur; je l'écrase.

Transfert automatique en écrasant les éventuels fichiers sur le serveur

Voici le contenu du scrip.bat

::Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants 
::Ce script utilise Curl (pour le ftp). La licence se situe dans le dossier bin
cls
::On met un titre au shell
@title Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants 
::Supprimer les retours écran
@echo off

::#### VARIABLES####
::PARTIE FTP
set user_ftp=userFtP
set pwd_ftp=pwdFtp
set ip_ftp=192.168.10.253
set path_ftp=/
::DOSSIER LOCAL A TRANSFERER
set local_path=%cd%\toSend

::Définition des Chemins
::répertoire racine
set rep_root=%cd%
::chemin des binaires
set rep_bin=%cd%\bin
::chemin des fichiers de journaux
set rep_log=%cd%\log

::Si le ping est négatif, quitter et logguer
ping -n 1 %ip_ftp%
if %errorlevel%==1 goto NO_LINK_SERV

::On envoie
cd %local_path%
::Eventuellement, remplacez *.* par le filtre de votre choix genre planing-*.pdf dans la partie qui suit
if exist ./*.* (
FOR %%f IN (*.*) DO (
::Envoi de chaque fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD %path_ftp%" -T "%%f" ftp://%ip_ftp%/
::On logue les infos dans un fichier 
echo "%date%|%time:~0,2%h%time:~3,2% : fichier %%f -- envoyé " >>%rep_log%/envois.log
)
::On supprime les fichiers après l envoi car on en a plus besoin
del/Q *.*)
GOTO FIN

:NO_LINK_SERV
::le serveur ne répond pas au ping 
echo "%date%|%time:~0,2%h%time:~3,2% : Le serveur FTP n'est pas joignable - Aucun transfert effectué" >>%rep_log%/connexions.log

:FIN
::On quitte

Plus qu'à mettre le script dans les tâches planifiées.

Commentaires

1. Le jeudi, décembre 29 2011, 11:28 par TimCruz

C'est beau! J'aime :) Je pense que je vais m'en inspirer pour quelques routines d’administration. Merci

2. Le lundi, janvier 21 2013, 16:04 par Alexandre BERTHIOT

Bonjour,
tout d'abord merci pour ces article intéressant, je voulais savoir, dans le fichier .ftp, si on peut aussi préciser un transfert depuis un serveur FTP jusqu’à notre réseau local depuis lequel on exécute le script ?
Merci d'avance :)

3. Le lundi, janvier 21 2013, 16:42 par gnieark

Bonsoir Alexandre,

Oui on peut. en FTP la commande pour télécharger un fichier est "GET"

Donc dans le fichier .ftp, à la place du "put plop.txt" Mettez "get fichier.txt" pour télécherger dans le repertoire courant le fichier "fichier.txt" qui se trouve sur le serveur ftp.

4. Le mercredi, septembre 11 2013, 20:17 par chadol

Bonjour,

Ma problématique est la suivante :

J'ai deux fichiers qui sont générés tous les soire (exemple le 11/09/2013)

fichier 1 = facture11092013.csv
fichier 2 = reglement11092013.csv

Je veux tous les soirs après génération de ces fichiers les exporter sur un serveur ftp dans deux repertoire differents (/reglement/ et /facture/) et ensuite apres export déplacer les fichiers sources dans le repertoire archive du serveur d'origine.

En utilisant la méthode avec curl en mettant comme noms des fichiers à transferer reglement*.csv et facture*.csv ca ne fonctionne pas.

5. Le mercredi, septembre 11 2013, 20:39 par gnieark

Chadol, je ferai un essai de filtres plus compliqués à tete reposée demain. je vous tiens au courant. Mais n'hésitez pas à copier votre script en commentaire (en masquant les mots de passe), que je puisse mieux voir.

6. Le mercredi, septembre 11 2013, 21:56 par chadol

::#### VARIABLES####
::PARTIE FTP
set user_ftp=xxxxxxx
set pwd_ftp=xxxxxxx


::Définition des Chemins
::répertoire racine
set rep_root=%cd%
::chemin des binaires
set rep_bin=%cd%\bin
::chemin des fichiers de journaux
set rep_log=%cd%\log

::Si le ping est négatif, quitter et logguer
ping -n 1 %ip_ftp%
if %errorlevel%==1 goto NO_LINK_SERV

CD C:\EDIFAPROD\

::Envoi du fichier règlement du jour sur le serveur ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -T "C:\EDIFAPROD\reg*.csv" ftp://serveurFTP.com/Mreglements

::Envoi du fichier règlement du jour sur le serveur ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -T "C:\EDIFAPROD\fact*.csv" ftp://serveurFTP.com/Mfactures"

::On déplace vers le répertoire archives, les deux fichiers .csv du jour

move /y \EDIFAPROD\*csv \Archives
GOTO FIN

:NO_LINK_SERV
::le serveur ne répond pas au ping
echo "%date%|%time:~0,2%h%time:~3,2% : Le serveur FTP n'est pas joignable - Aucun transfert effectué" >>%rep_log%/connexions.log

:FIN
::On quitte

7. Le mercredi, septembre 11 2013, 22:26 par Gnieark
Chadol, je vois le problème.

Dans votre script la wildcard est dans un paramétre de la commande curl (et il n'a pas l'air de le gérér)

remplacez la ligne:
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -T "C:\EDIFAPROD\reg*.csv" ftp://serveurFTP.com/Mreglements
par les trois lignes suivantes:
FOR %%f IN (reg*.csv) DO (
::Envoi du fichier fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD Mreglements" -T "%%f" ftp://VotreServeurFtp/
)



et Idem pour les factures

Je n'ai pas de windows sous la main pour vérifier. Je ne suis pas certain que le batch permette de faire "FOR %%f IN (reg*.csv)". C'est à tester
8. Le mercredi, septembre 11 2013, 22:30 par gnieark

faudra que je prenne le temps de me pencher sur l'amélioration de l'interface de rédaction des commentaires sur ce blog

9. Le jeudi, septembre 12 2013, 07:42 par chadol

Bonjour,

Ca marche super bien sur mon poste en local. Je le test en prod dans la journée et reviens vers toi.

Encore merci.

10. Le jeudi, septembre 12 2013, 08:11 par chadol

Je n'arrive plus à déplacer les fichiers .csv dans le repertoire \archives après transfert ...

11. Le jeudi, septembre 12 2013, 15:18 par chadol

Re bonjour,
Finalement ca fonctionne.
Le transfert se passe bien et les fichiers sont déplacés dans le dossier \archives.

Mais le fichier log n'enregistre aucun événement...

Je renvoie le script complet pour info :

::Extraction de données dans la base oracle de FV10
::Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
::Ce script utilise Curl (pour le ftp). La licence se situe dans le dossier bin
cls
::On met un titre au shell
@title Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
::Supprimer les retours écran
@echo off

::PARTIE EXTRACTION DES DONN2ES DANS FV10
sqlplus compta/COMPTA@GALBV-OAS-01.FV10 @GPM_EXPORT_FACT_EDI.sql
sqlplus compta/COMPTA@GALBV-OAS-01.FV10 @GPM_EXPORT_RGL_EDI.sql

::#### VARIABLES####
::PARTIE FTP
set user_ftp=xxxxxxx
set pwd_ftp=xxxxxxxx
set ip_ftp=xxxxxxxxx


::DOSSIER LOCAL A TRANSFERER
set local_path=%cd%\EDIFAPROD

::Définition des Chemins
::répertoire racine
set rep_root=%cd%
::chemin des binaires
set rep_bin=%cd%\bin
::chemin des fichiers de journaux
set rep_log=%cd%\log

::Si le ping est négatif, quitter et logguer
ping -n 1 %ip_ftp%
if %errorlevel%==1 goto NO_LINK_SERV

cd %local_path%

::Envoi du fichier reglement sur le seveur ftp
FOR %%f IN (reg*.csv) DO (
::Envoi du fichier fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD reglements" -T "%%f" ftp://leftp.com/
)

::Envoi du fichier facture sur le seveur ftp
FOR %%f IN (fac*.csv) DO (
::Envoi du fichier fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD factures" -T "%%f" ftp://leFtp.com/
)

::On déplace vers le repertoire archives, les fichiers après l envoi car on en a plus besoin
move /y \EDIFAPROD\*.CSV \EDIFAPROD\Archives
GOTO FIN


:NO_LINK_SERV
::le serveur ne répond pas au ping
echo "%date%|%time:~0,2%h%time:~3,2% : Le serveur FTP n'est pas joignable - Aucun transfert effectué" >>%rep_log%/connexions.log

:FIN
::On quitte

12. Le vendredi, septembre 13 2013, 12:03 par Gnieark
Hello, pour que ça logue ajoute la ligne suivante dans tes deux boucles for:

echo "%date%|%time:~0,2%h%time:~3,2% : fichier %%f -- envoyé " >>%rep_log%/envois.log

Comme ceci:

::Envoi du fichier reglement sur le seveur ftp
FOR %%f IN (reg*.csv) DO (
::Envoi du fichier fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD reglements" -T "%%f" ftp://leftpf.om/
::Log it:
echo "%date%|%time:~0,2%h%time:~3,2% : fichier %%f -- envoyé " >>%rep_log%/envois.log
)

PS fais attention, j'ai fait le choix de changer le nom de ton FTP dans ma réponse et la tienne, pense à le remettre dans ton, script

13. Le mercredi, avril 23 2014, 16:25 par Nym

Merci pour vos exemple qui m'ont permis d'y voir plus clair.
Par contre j'aurais un bémol sur la partie:

::Si le ping est négatif, quitter et logguer
ping -n 1 %ip_ftp%
if %errorlevel%==1 goto NO_LINK_SERV

Car en test ma passerelle m'a dit que le serveur était injoignable mais le ping n'a pas retourné de valeur d'erreur.

14. Le vendredi, novembre 11 2016, 02:29 par hervix

Bonjour,

très intéressant ce script, y a t-il un moyen pour rajouter une notion de date pour le transfert des fichiers?

J'aimerais pouvoir transférer sur un ftp des dossiers qui n'ont jamais le même nom après une période donnée, genre tu me transfères les dossiers plus vieux que 3 mois et ensuite tu les effaces de l'emplacement source

bien cordialement

15. Le jeudi, novembre 24 2016, 21:07 par ugenmib

Bonsoir,
je réagis à cet article très intéressant (bravo) car je rencontre un souci avec la commande ftp pour lequel je n'ai pas trouvé de solution à ce jour.

Très simplement dans un .bat je veux automatiser des transferts, mon script débute par la commande ftp qui fait appel à un ficher contenant les paramètres de connection et commandes ftp :

ftp -i -s:cmdftp.txt

Dans cmdftp.txt il y a :
open xxx.xx. (adresse IP)
user UtiLIsateur MotDePAsse

puis les commandes ftp.

Mon problème est que ni les majuscules du nom d'utilisateur, ni celle du mot de passe ne sont passées à la commande ftp (toutes les lettres sont en minuscule) en conséquence le serveur refuse la connexion ne reconnaissant pas les paramètres!

Avez-vous déjà rencontré ce genre de souci? Avez-vous une solution?

Merci d'avance,

16. Le dimanche, janvier 22 2017, 13:08 par gnieark

hervix> Oui, c'est possible. Un exemple ici de suppression de fichiers vieux de N jours: http://stackoverflow.com/questions/... sauf qu'au lieu de supprimmer, il faut que tu adaptes le script pour qu'il fasse ce que tu veux d'autre.

urgenmib> Zut, je n'avais pas vu ton commentaire plus tôt.
Heu pour ton problème, ça me parait bizare. Je n'ai pas de windows sous la main pour tester si c'était sensible à la casse. j'essaie de faire ça prochainement

17. Le mercredi, mars 15 2017, 08:50 par Tony

Bonjour,

Super merci pour le script, je viens de l'exécuter mais le FTP sur lequel je souhaite envoyer est en mode passif et chiffrement : connexion FTP implicite sur TLS.

Savez-vous quel paramètre dois-je intégrer à la ligne ? j'ai ajouté le -P 990 :

::Envoi de chaque fichier sur le ftp
%rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD %path_ftp%" -T "%%f" ftp://%ip_ftp%/ -P 990

Mais cela ne fonctionne pas....

Merci d'avance

Tony

18. Le jeudi, avril 20 2017, 08:48 par manel

bonjour j'ai gros soucis pour écrire un script .bat, je dois automatiser l'envoi des fichier .xml vers le serveur DOCAPOST FAST, je peux le faire manuellement sur FileZilla Client, mais je n'arrive pas à écrire le script.
pouvez vous m'aider ? et m'indiquer des pistes ...

19. Le jeudi, avril 27 2017, 07:14 par gnieark

Manuel>
Heu...

Donne nous plus d'infos pour qu'on t'aide.

Type de ftp (passif/actif)

Les fichiers que tu souhaites envoyer doivent-ils écraser ceux sur la destination ?

Y a -til une regle de nomage, une architecture de fichiers plus précise?

etc....

20. Le mardi, juin 27 2017, 15:15 par Cris

Bonsoir,
je réagis à cet article très intéressant (bravo) car je rencontre un souci, je voulais savoir comment faire pour décompresser un fichier .jar lequel je n'ai pas trouvé de solution à ce jour.
Merci d'avance

21. Le vendredi, juin 30 2017, 14:12 par Marc

Hello Cris,
Si tu souhaites extraire un fichier jar, tu ouvres un prompt (démarrer et exécuter "CMD")
et tu tapes: java -jar <le nom du fichier> (c:\mon-fichier.jar). Au préalable, il me semble qu'il est nécessaire d'installer javaruntime :)

Vive le blog du grouik au passage !

22. Le lundi, août 14 2017, 13:05 par Melo

Bonjour !
voila j'ai un besoin urgent, si quelqu'un peu me proposé une solution (scripts) par rapport à mon cas:
j'ai une machine locale et plusieurs répertoires distants dont je veux transférer les fichiers automatiquement entre les ces machines et que les fichiers copies doivent être supprimer après le transfert du répertoire de source.
NB: j'ai un répertoire source (machine locale) et plusieurs répertoires de destination (machine distantes)

Merci

Page top