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.

Code : Tout sélectionner

dir c:\rep /ad /s | find "REP" | find "." /V

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:

Code : Tout sélectionner

setlocal enableDelayedExpansion
set var1=!var1:~0,-1!
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 @+