Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

aide sur un script FTP pour recuperer des fichiers et les renommer

7 réponses
Avatar
totox24
Bonjour à tous

J'ai un p'tit PB sur un batch FTP
pour récuperer des fichier sur un serveur internet
et pour renomer ces fichiers
le tout en automatique:


voila ce que j'ai fais:


fichier commande.cmd:


@echo off
cls
cd F:\sauve\Internet
ftp -inv -s:"F:\sauve\Internet\cmd.ftp"
FOR /F %%i IN (liste.txt) DO (ftp -inv -s:"F:\sauve\Internet\cmd1.ftp")



fichier cmd.ftp:
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
ls *.sql liste.txt
bye



fichier cmd1.ftp
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
mget %%i
rename %%i %%i.old
bye


La question :

Comment récupérer la variable du fichier "commande.cmd"
dans le fichier "cmd1.ftp" ?

Merci pour votre aide....

totox24

7 réponses

Avatar
Jean-Claude BELLAMY
Dans le message news: ,
totox24 s'est ainsi exprimé:

Bonjour à tous

J'ai un p'tit PB sur un batch FTP
pour récuperer des fichier sur un serveur internet
et pour renomer ces fichiers
le tout en automatique:


voila ce que j'ai fais:


fichier commande.cmd:


@echo off
cls
cd F:sauveInternet
ftp -inv -s:"F:sauveInternetcmd.ftp"
FOR /F %%i IN (liste.txt) DO (ftp -inv
-s:"F:sauveInternetcmd1.ftp")



fichier cmd.ftp:
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
ls *.sql liste.txt
bye



fichier cmd1.ftp
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
mget %%i
rename %%i %%i.old
bye


La question :

Comment récupérer la variable du fichier "commande.cmd"
dans le fichier "cmd1.ftp" ?



Problème classique ...

Vu que le fichier de commandes FTP est un fichier texte, donc passif, il
n'est pas possible de lui passer des paramètres formels.
Mais il y a une solution : Créer DYNAMIQUEMENT le dit fichier de commande
dans le batch !

@echo off
cls
cd F:sauveInternet
ftp -inv -s:"F:sauveInternetcmd.ftp"
FOR /F %%i IN (liste.txt) DO (
echo open xxx.xxx.xxx.xxx > cmd1.ftp
echo USER nom pass >> cmd1.ftp
echo cd sql >> cmd1.ftp
echo mget %%i >> cmd1.ftp
echo rename %%i %%i.old >> cmd1.ftp
echo bye >> cmd1.ftp
ftp -inv -s:"F:sauveInternetcmd1.ftp"
)


Étonnant, non ? ;-)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
totox24
Problème classique ...

Vu que le fichier de commandes FTP est un fichier texte, donc passif, il
n'est pas possible de lui passer des paramètres formels.
Mais il y a une solution : Créer DYNAMIQUEMENT le dit fichier de commande
dans le batch !

@echo off
cls
cd F:sauveInternet
ftp -inv -s:"F:sauveInternetcmd.ftp"
FOR /F %%i IN (liste.txt) DO (
echo open xxx.xxx.xxx.xxx > cmd1.ftp
echo USER nom pass >> cmd1.ftp
echo cd sql >> cmd1.ftp
echo mget %%i >> cmd1.ftp
echo rename %%i %%i.old >> cmd1.ftp
echo bye >> cmd1.ftp
ftp -inv -s:"F:sauveInternetcmd1.ftp"
)


Étonnant, non ? ;-)




Merci Monsieur
C super cool..

Avatar
Ma Dalton
Bonjour,

Intéressant comme méthode.

Sauf que dans mon cas, j'ai besoin d'un peu plus puisque dans un premier
temps je récupère une liste de fichiers d'un serveur (je n'ai pas de
difficulté pour ça). Je dois maintenant repousser cette même liste de
fichiers vers plusieurs serveurs distincts (92) et pour chacun, le login et
mot de passe est distint. Ma logique de programmation fonctionne
correctement pour unseul serveur mais je triche sur le login et le pw que
j'inscrit actuellement en clair. Pour solutionner cette limite j'aimerais
pouvoir implanter une boucle pour chaque serveur. En ce sens, je songe à
faire usage d'un fichier texte dont chaque ligne correspondrait à un serveur
(IP, login, pw).

Ma question est la suivante: comment récupérer distinctement ces 3
informations (ex %%a, %%b et %%c)

merci

[...]
FOR /F %%a IN (ListeSite.txt) DO (
echo -----------------------------------------------Site distant %%a >>
FTP.log
echo open %%a > SNSUpush.ftp
echo USER %%b %%c >> SNSUpush.ftp
echo binary >> SNSUpush.ftp
echo cd /rep1/rep2 >> SNSUpush.ftp
FOR /F %%j IN (ListeFichierPropag.txt) DO (
echo put %%j >> SNSUpush.ftp
)
echo dir *.Z >> SNSUpush.ftp
echo bye >> SNSUpush.ftp
ftp -inv -s:"SNSUpush.ftp" >> FTP.log
)
del SNSUpush.ftp
[...]


"Jean-Claude BELLAMY" a écrit dans le
message de news: %
Dans le message news: ,
totox24 s'est ainsi exprimé:

Bonjour à tous

J'ai un p'tit PB sur un batch FTP
pour récuperer des fichier sur un serveur internet
et pour renomer ces fichiers
le tout en automatique:


voila ce que j'ai fais:


fichier commande.cmd:


@echo off
cls
cd F:sauveInternet
ftp -inv -s:"F:sauveInternetcmd.ftp"
FOR /F %%i IN (liste.txt) DO (ftp -inv
-s:"F:sauveInternetcmd1.ftp")



fichier cmd.ftp:
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
ls *.sql liste.txt
bye



fichier cmd1.ftp
open xxx.xxx.xxx.xxx
USER nom pass
cd sql
mget %%i
rename %%i %%i.old
bye


La question :

Comment récupérer la variable du fichier "commande.cmd"
dans le fichier "cmd1.ftp" ?



Problème classique ...

Vu que le fichier de commandes FTP est un fichier texte, donc passif, il
n'est pas possible de lui passer des paramètres formels.
Mais il y a une solution : Créer DYNAMIQUEMENT le dit fichier de commande
dans le batch !

@echo off
cls
cd F:sauveInternet
ftp -inv -s:"F:sauveInternetcmd.ftp"
FOR /F %%i IN (liste.txt) DO (
echo open xxx.xxx.xxx.xxx > cmd1.ftp
echo USER nom pass >> cmd1.ftp
echo cd sql >> cmd1.ftp
echo mget %%i >> cmd1.ftp
echo rename %%i %%i.old >> cmd1.ftp
echo bye >> cmd1.ftp
ftp -inv -s:"F:sauveInternetcmd1.ftp"
)


Étonnant, non ? ;-)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*





Avatar
Jean-Claude BELLAMY
Dans le message news: ,
Ma Dalton s'est ainsi exprimé:

Bonjour,

Intéressant comme méthode.

Sauf que dans mon cas, j'ai besoin d'un peu plus puisque dans un
premier temps je récupère une liste de fichiers d'un serveur (je n'ai
pas de difficulté pour ça). Je dois maintenant repousser cette même
liste de fichiers vers plusieurs serveurs distincts (92) et pour
chacun, le login et mot de passe est distint. Ma logique de
programmation fonctionne correctement pour unseul serveur mais je
triche sur le login et le pw que j'inscrit actuellement en clair. Pour
solutionner cette limite j'aimerais pouvoir implanter une boucle
pour chaque serveur. En ce sens, je songe à faire usage d'un fichier
texte dont chaque ligne correspondrait à un serveur (IP, login, pw).

Ma question est la suivante: comment récupérer distinctement ces 3
informations (ex %%a, %%b et %%c)

merci

[...]
FOR /F %%a IN (ListeSite.txt) DO (
echo -----------------------------------------------Site distant
%%a >> FTP.log
echo open %%a > SNSUpush.ftp
echo USER %%b %%c >> SNSUpush.ftp
echo binary >> SNSUpush.ftp
echo cd /rep1/rep2 >> SNSUpush.ftp
FOR /F %%j IN (ListeFichierPropag.txt) DO (
echo put %%j >> SNSUpush.ftp
)
echo dir *.Z >> SNSUpush.ftp
echo bye >> SNSUpush.ftp
ftp -inv -s:"SNSUpush.ftp" >> FTP.log
)
del SNSUpush.ftp
[...]


Il suffit d'ajouter le commutateur "tokens=...." dans la boucle FOR, afin
d'indiquer combien de "jetons" (et lesquels) tu veux récupérer.

FOR /F "tokens=1,2,3" %%a IN (ListeSite.txt) DO (


J'ai supposé implicitement ici que dans le fichier "ListeSite.txt" :
- le séparateur entre chaque champ est l'espace
- les champs à récupérer sont les 1er, 2ème et 3ème


Au cours de l'exécution de la boucle, on aura automatiquement :
%%a = 1er champ
%%b = 2ème champ
%%c = 3ème champ

NB: on ne peut donc pas avoir plus de 26 champs !

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
Ma Dalton
Bonjour,

Mes copains au soutien technique vont être VRAIMENT impressionnés de ma
trouvaille puisqu'ils n'auront plus à faire de transferts manuel pour
réaliser des mises à jour dans nos 92 serveurs (nationaux, régionnaux et
locaux). Nous gagnerons très rapidement un temp fou.

MERCI beaucoup

NB. Vous avez bien fait de supposer l'espace pour séparer les champs, je
sais maintenant quoi mettre! Aussi, j'ai lu que la variable de boucle est
sensible à la case. Ainsi %%a et %%A (jusqu'à z-Z) ne donnerait-il pas une
possibilité de 52 tokens?


"Jean-Claude BELLAMY" a écrit dans le
message de news: %
Dans le message news: ,
Ma Dalton s'est ainsi exprimé:

Bonjour,

Intéressant comme méthode.

Sauf que dans mon cas, j'ai besoin d'un peu plus puisque dans un
premier temps je récupère une liste de fichiers d'un serveur (je n'ai
pas de difficulté pour ça). Je dois maintenant repousser cette même
liste de fichiers vers plusieurs serveurs distincts (92) et pour
chacun, le login et mot de passe est distint. Ma logique de
programmation fonctionne correctement pour unseul serveur mais je
triche sur le login et le pw que j'inscrit actuellement en clair. Pour
solutionner cette limite j'aimerais pouvoir implanter une boucle
pour chaque serveur. En ce sens, je songe à faire usage d'un fichier
texte dont chaque ligne correspondrait à un serveur (IP, login, pw).

Ma question est la suivante: comment récupérer distinctement ces 3
informations (ex %%a, %%b et %%c)

merci

[...]
FOR /F %%a IN (ListeSite.txt) DO (
echo -----------------------------------------------Site distant
%%a >> FTP.log
echo open %%a > SNSUpush.ftp
echo USER %%b %%c >> SNSUpush.ftp
echo binary >> SNSUpush.ftp
echo cd /rep1/rep2 >> SNSUpush.ftp
FOR /F %%j IN (ListeFichierPropag.txt) DO (
echo put %%j >> SNSUpush.ftp
)
echo dir *.Z >> SNSUpush.ftp
echo bye >> SNSUpush.ftp
ftp -inv -s:"SNSUpush.ftp" >> FTP.log
)
del SNSUpush.ftp
[...]


Il suffit d'ajouter le commutateur "tokens=...." dans la boucle FOR, afin
d'indiquer combien de "jetons" (et lesquels) tu veux récupérer.

FOR /F "tokens=1,2,3" %%a IN (ListeSite.txt) DO (


J'ai supposé implicitement ici que dans le fichier "ListeSite.txt" :
- le séparateur entre chaque champ est l'espace
- les champs à récupérer sont les 1er, 2ème et 3ème


Au cours de l'exécution de la boucle, on aura automatiquement :
%%a = 1er champ
%%b = 2ème champ
%%c = 3ème champ

NB: on ne peut donc pas avoir plus de 26 champs !

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*





Avatar
Jean-Claude BELLAMY
Dans le message news:e7S7o% ,
Ma Dalton s'est ainsi exprimé:

Bonjour,

Mes copains au soutien technique vont être VRAIMENT impressionnés de
ma trouvaille puisqu'ils n'auront plus à faire de transferts manuel
pour réaliser des mises à jour dans nos 92 serveurs (nationaux,
régionnaux et locaux). Nous gagnerons très rapidement un temp fou.

MERCI beaucoup

NB. Vous avez bien fait de supposer l'espace pour séparer les champs,
je sais maintenant quoi mettre! Aussi, j'ai lu que la variable de
boucle est sensible à la case. Ainsi %%a et %%A (jusqu'à z-Z) ne
donnerait-il pas une possibilité de 52 tokens?


Je ne suis pas sûr de la valeur limite car :

- je n'ai jamais testé ..
- la doc Microsoft n'est pas claire à ce sujet !
http://www.microsoft.com/windows2000/fr/professional/help/for__examples.htm
En effet, on lit dans le même paragraphe 2 infos quasi contradictoires :
"[...]Vous pouvez spécifier jusqu'à 26 jetons à l'aide
de la ligne tokens=, à condition que cela n'entraîne
pas une tentative de déclaration d'une variable supérieure
à " z " ou " Z ".
N'oubliez pas que les noms de variable for différencient
la casse, qu'il s'agit de variables globales et que vous
ne pouvez pas en activer plus de 52 au total."

Alors ? 26 ou 52 ?

Je pencherais néanmoins pour une limite de 26 ...
Car si "a" succédait à "Z", MS n'aurait pas écrit
"...n'entraîne pas une tentative de déclaration d'une variable
supérieure à " z " ou " Z "."



--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
Ma Dalton
entre 26 ou 52, 26 sera plus que suffisant, sinon utiliser un autre moyen,
n'est-ce pas?
Et pour terminer ma ternière question : Y a t-il une bible des commandes
avec de bons exemples et les trucs du métiers?

merci et je lève maintenant mon verre à votre santé.
A+

- la doc Microsoft n'est pas claire à ce sujet !

http://www.microsoft.com/windows2000/fr/professional/help/for__examples.htm
En effet, on lit dans le même paragraphe 2 infos quasi contradictoires :
"[...]Vous pouvez spécifier jusqu'à 26 jetons à l'aide
de la ligne tokens=, à condition que cela n'entraîne
pas une tentative de déclaration d'une variable supérieure
à " z " ou " Z ".
N'oubliez pas que les noms de variable for différencient
la casse, qu'il s'agit de variables globales et que vous
ne pouvez pas en activer plus de 52 au total."

Alors ? 26 ou 52 ?

Je pencherais néanmoins pour une limite de 26 ...
Car si "a" succédait à "Z", MS n'aurait pas écrit
"...n'entraîne pas une tentative de déclaration d'une variable
supérieure à " z " ou " Z "."