Page 1 sur 1
[Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 24 mars 2008 14:43
par med1974
Bonjour A tous,
Voila, je voudrai créer un fichier Batch qui sert a : trouver un mot ex: daniel dans plusieurs fichiers de nom (l-000-msg2*.txt) qui se trouvent dans des répertoires sous le nom (20080223) la date du jour. si le nom daniel est trouvé je fait une copie de sauvegarde de ce fichier.
Merci de votre contribution
Mes salutations
Re: Trouve un nom dans un fichier puis faire la sauvegarde de ce
Posté : 24 mars 2008 21:54
par flox
Bonjour,
Si j'ai bien compris, je pense que ce script devrait faire ce que tu souhaite
Arborescence
-C:\
----BAK
----REP
--------20080223
--------------------l-000-msg1.txt
---------------------------|Daniel marc
--------------------l-000-msg2.txt
---------------------------| antoine sebastien
--------20080224
--------------------l-001-msg1.txt
---------------------------| fabien laurent
--------------------l-002-msg2.txt
---------------------------| jules Daniel
fichier c:\test.bat
Code : Tout sélectionner
@echo off
rem efface les fichiers temporaire
del c:\temp.txt
del c:\listrep.txt
rem enregisrte dans le fichier listrep.txt le nom de tous les repétoire du dossier c:\rep
dir c:\rep /ad | find "REP" | find "." /V > c:\listrep.txt
rem pour tous les fichiers contenue dans les repertoires précedement selectionnée
rem trouver les fichiers conteant "Daniel" et ecrire le resultat dans temp.txt
for /f "tokens=4 delims= " %%a in (c:\listrep.txt) do (find c:\rep\%%a\* "daniel" /C >> c:\temp.txt)
setlocal enableDelayedExpansion
rem pour tous les fichier dans temp.txt si il contient Daniel alors copie vers le rep c:\bak
for /f "tokens=2,3 delims= " %%a in (c:\temp.txt) do (
set var1=%%a
set var1=!var1:~0,-1!
if %%b EQU 1 xcopy !var1! c:\bak
)
endlocal
Résultat les fichiers l-001-msg2.txt et l-000-msg1.txt sont copié dans le répertoire c:\bak
Dis moi si c'est bien ça que tu voulais
Re: Trouve un nom dans un fichier puis faire la sauvegarde de ce
Posté : 25 mars 2008 17:27
par med1974
Bonjour,
Merci beaucoup de votre aide, ça marche mais je voudrai plus de détails sur ces commandes
ex: dir c:\rep /ad | find "REP" | find "." /V > c:\listrep.txt
find "." pourquoi il y a pas de point dans le fichier listrep.txt
merci pour votre contribution
Mes Salutations
flox a écrit :Bonjour,
Si j'ai bien compris, je pense que ce script devrait faire ce que tu souhaite
Arborescence
-C:\
----BAK
----REP
--------20080223
--------------------l-000-msg1.txt
---------------------------|Daniel marc
--------------------l-000-msg2.txt
---------------------------| antoine sebastien
--------20080224
--------------------l-001-msg1.txt
---------------------------| fabien laurent
--------------------l-002-msg2.txt
---------------------------| jules Daniel
fichier c:\test.bat
Code : Tout sélectionner
@echo off
rem efface les fichiers temporaire
del c:\temp.txt
del c:\listrep.txt
rem enregisrte dans le fichier listrep.txt le nom de tous les repétoire du dossier c:\rep
dir c:\rep /ad | find "REP" | find "." /V > c:\listrep.txt
rem pour tous les fichiers contenue dans les repertoires précedement selectionnée
rem trouver les fichiers conteant "Daniel" et ecrire le resultat dans temp.txt
for /f "tokens=4 delims= " %%a in (c:\listrep.txt) do (find c:\rep\%%a\* "daniel" /C >> c:\temp.txt)
setlocal enableDelayedExpansion
rem pour tous les fichier dans temp.txt si il contient Daniel alors copie vers le rep c:\bak
for /f "tokens=2,3 delims= " %%a in (c:\temp.txt) do (
set var1=%%a
set var1=!var1:~0,-1!
if %%b EQU 1 xcopy !var1! c:\bak
)
endlocal
Résultat les fichiers l-001-msg2.txt et l-000-msg1.txt sont copié dans le répertoire c:\bak
Dis moi si c'est bien ça que tu voulais
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 25 mars 2008 20:31
par flox
Salut,
Code : Tout sélectionner
ex: dir c:\rep /ad | find "REP" | find "." /V > c:\listrep.txt
en fait cette commande permet de lister les sous dossier, cela fonctionne en filtrant les ligne contenant "REP" puis en excluant (/V) les lignes ou il y a un point.
dir c:\rep /ad (affiche uniquement les repertoires)
Code : Tout sélectionner
Le volume dans le lecteur C s'appelle OS
Le numéro de série du volume est C842-3B3B
Répertoire de c:\rep
24/03/2008 13:51 <REP> .
24/03/2008 13:51 <REP> ..
24/03/2008 20:08 <REP> 20080223
24/03/2008 19:35 <REP> 20080224
0 fichier(s) 0 octets
4 Rép(s) 73 750 859 776 octets libres
dir c:\rep /ad | find "REP"
Code : Tout sélectionner
24/03/2008 13:51 <REP> .
24/03/2008 13:51 <REP> ..
24/03/2008 20:08 <REP> 20080223
24/03/2008 19:35 <REP> 20080224
dir c:\rep /ad | find "REP" | find "." /V
Code : Tout sélectionner
24/03/2008 20:08 <REP> 20080223
24/03/2008 19:35 <REP> 20080224
@ bientôt sur le forum
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 25 mars 2008 20:43
par lbn
N'y a til pas besoin d'ajouter /S pour le dir pour voir les sous repertoires ?
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 25 mars 2008 20:46
par flox
Si bien entendu si ton arborescence descend encore d'un niveau.
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 25 mars 2008 20:49
par lbn
Ok grand merci !
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 29 mars 2008 10:52
par med1974
Bonjour,
je voudrai aussi savoir la signification de ces deux expressions
1. setlocal enableDelayedExpansion
2. set var1=!var1:~0,-1!
et par exemple j'ai dans un fichier dans la 3 ligne deux valeur que je dois testé (c.a.d valeur 1 >12 et <35 puis valeur 2 >4 et <10)
merci beaucoup
Re: [Résolu] Trouve un nom dans un fichier et en faire une copie
Posté : 29 mars 2008 14:44
par flox
Bonjour,
Ces deux expressions vont ensemble:
Il s'agit de l'expansion retardé comme expliqué dans la
FAQ, cela permet de parer au problème des boucles FOR, en effet lorsque que l'on crée une de ces boucle il est impossible de définir une variable dans cette dernière. La solution est donc d'activer l'expansion retardé et ensuite d'appeler les variables non plus avec des pourcentages mais des point d'exclamation !. Dans l'exemple ci dessus on re-découpe même la variable en enlevant le dernier caractère ":~0,-1".
et par exemple j'ai dans un fichier dans la 3 ligne deux valeur que je dois testé (c.a.d valeur 1 >12 et <35 puis valeur 2 >4 et <10)
Pour réaliser cette opération tu peut imbriqué des IF:
exemple:
Code : Tout sélectionner
set valeur=15
if %valeur% GTR 12 (
if %valeur% LSS 35 echo %valeur% est inferieur a 35 et superieur a 12
)
pause
regardes
les exemples du site
En espérant avoir pu t'éclairer @+