[Batch] [resolu] Copier le premier fichier de chaque sous repertoire

Copier le premier fichier de chaque sous repertoire [Batch] [resolu] - Shell/Batch - Programmation

Marsh Posté le 02-09-2007 à 19:53:15    

Bonjour,
 
Le titre explique le problème... :(  
J'avais bien pensé à quelque chose comme ça:
 
For /F "usebackq" %%i (`dir C:\test\ /S /O:-N /B`) do set N=%%i
copy %N% c:\test
 
Mais le souci s'est que ça copie bien le premier fichier mais uniquement du dernier sous-repertoire.
Si quelqu'un à une idée :pt1cable:  
 
Merci d'avance.
 
Ps: Batch pour NT


Message édité par Dodge_Kowalski le 05-09-2007 à 21:12:55
Reply

Marsh Posté le 02-09-2007 à 19:53:15   

Reply

Marsh Posté le 03-09-2007 à 00:27:16    

t'y était presque, le probleme c'est que sa execute la boucle en executant la commande  SET N=%%i et ensuite il passe a la ligne suivante. Donc le plus simple :
 
For /F "usebackq" %%i (`dir C:\test\ /S /O:-N /B`) do copy %%i c:\test

Reply

Marsh Posté le 03-09-2007 à 09:37:53    

blastkiller a écrit :

t'y était presque, le probleme c'est que sa execute la boucle en executant la commande  SET N=%%i et ensuite il passe a la ligne suivante. Donc le plus simple :
 
For /F "usebackq" %%i (`dir C:\test\ /S /O:-N /B`) do copy %%i c:\test


 
Le problème, c'est que là, ça copie tous les fichiers des sous-répertoire. Moi, je voudrais juste le premier fichier de chaque sous répertoire.
 
Il faudrait que je me déplace de sous-répertoire en sous répertoire. Je pensais récuperer les adresses des sous répertoire, style C:\test\T1, C:\test\T2 etc. dans un fichier. Passer ces chemins en paramètres à la fonction CD avec un FOR /F puis je lance:
 For /F "usebackq" %%i (`dir *.* /O:-N /B`) do set N=%%i  
 copy %N% c:\test  
et je reboucle pour passer dans le sous-répertoire suivant.
 
Le problème, c'est que j'arrive pas récupérer les chemins de façon propre: Dir C: /test /S>"chemins.txt" c'est pourave  :non: De plus, je ne sais pas si je peux passer des paramètres à CD et si le DIR *.* va être accepté...
 
J'essaye cela ce matin. Bien sur, je suis toujours preneur d'aide ou conseils  :D

Reply

Marsh Posté le 03-09-2007 à 11:21:49    

J'ai trouvé comment récupérer les chemins des sous répertoires:
For /R "c:\test" %%i in (.) do echo %%~fi>>chemin.txt

Reply

Marsh Posté le 03-09-2007 à 13:09:58    

Je bloque car:
For /R "c:\test" %%i in (.) do echo %%~fi>>chemin.txt  
For /F "skip=1" %%a in (C:\test\chemin.txt) do goto :copier
:copier
CD %a%
For /F "usebackq" %%b (`dir /O:-N /B`) do set N=%%b  
copy %N% c:\test  
Me donne: impossible de copier le fichier sur lui même
Je sais que la première ligne de mon fichier est c:\test et comme je veux seulement le 1er fichier des sous-répertoire, je pensais que le Skip=1 sauterait la 1ère ligne du fichier pour arriver sur C:\test\T1, mais ça ne marche pas.
Je ne suis pas sur non plus que CD %a% fonctionne :(
HELP!!


Message édité par Dodge_Kowalski le 03-09-2007 à 13:15:14
Reply

Marsh Posté le 03-09-2007 à 14:49:38    

Bon, je continu tous seul, au cas ou ça intéresserais qq'un ;)
J'ai remplacé For /R "c:\test" %%i in (.) do echo %%~fi>>chemin.txt
            par Dir /A: d /S /B "C:\test"|sort /R>chemin.txt
et maintenant je n'ai plus que les chemins des sous-répertoires dans le fichier. Le hic, c'est que je suis quasi certain que CD %a% ne me déplace pas de sous-répertoire en sous répertoire:( J'ai essayé CD<%a% mais ça foire aussi...


Message édité par Dodge_Kowalski le 03-09-2007 à 14:50:34
Reply

Marsh Posté le 03-09-2007 à 18:33:22    

Je ne comprend pas pourquoi ça ne marche pas:
Dir /A: d /S /B "C:\test"|sort /R>chemin.txt  
For F/ %%i in (C:\test\chemin.txt) do (
cd %%i
For /F "usebackq" %%b (`dir /O:-N /B`) do set N=%%b  
copy %N% c:\test  
)
Il fait le traitement seulement sur le dernier chemin du fichier ?? Pourquoi il zappe le premier:(

Reply

Marsh Posté le 04-09-2007 à 04:11:01    

for /f "delims=" %%a in ('dir /a:d /b') do call :cmd "%%a"
exit
:cmd
set folder=%1
for /f "delims=" %%b in ('dir %folder% /b /o:-n /a:-d') do set file="%%b"
copy %folder%\%file% \test\

Message cité 1 fois
Message édité par blastkiller le 04-09-2007 à 04:11:10
Reply

Marsh Posté le 04-09-2007 à 22:21:41    

blastkiller a écrit :

for /f "delims=" %%a in ('dir /a:d /b') do call :cmd "%%a"
exit
:cmd
set folder=%1
for /f "delims=" %%b in ('dir %folder% /b /o:-n /a:-d') do set file="%%b"
copy %folder%\%file% \test\


 :bounce: Merci Blastkiller, ton approche marche aprés quelques petites modif.
Comme je maitrise pas vraiment le batch, j'ai d'abord cru que ça ne fonctionner pas car rien ne se copier.  
Pour en avoir le coeur net, j'ai enlevé l'echo off mis une pause et j'ai regardé le déroulement du script et j'ai vu ça:
 
http://img117.imageshack.us/img117/3782/capturer1bic4.jpg
Du coup, j'ai enlevé les guillemets sur %%a et %%b puis rajouté c:\test\ dans le copy et ça marche nickel :sol:  
 
http://img240.imageshack.us/img240/170/capturer2bsm2.jpg
Maintenant, je vais essayer de finaliser en passant le "c\test\" en parametre de lancement comme ça je pourrais lançais mon batch pour mes divers répertoires à traiter sans avoir à éditer le batch à chaque fois.
 
En tout cas, un grand merci pour ton aide blastkiller :jap: je n'aurais pas réussi tout seul  :sweat:  :)


Message édité par Dodge_Kowalski le 04-09-2007 à 22:25:28
Reply

Marsh Posté le 04-09-2007 à 23:01:03    

Par contre maintenant, t'auras des problemes avec les dossers et les fichiers contenant des espaces. Utilise plutot ça :
 
for /f "delims=" %%a in ('dir /a:d /b') do call :cmd "%%a"
pause
exit
:cmd
set folder=%~1
for /f "delims=" %%b in ('dir "%folder%" /b /o:-n /a:-d') do set file="%%b"
copy "c:\test\%folder%\%file:"=%" c:\test\
 
 
Donc ce qui change : set folder=%~1
Ceci permet de renlever les guillemets
et : copy "%folder%\%file:"=%" \test\
%file:"=% la variable ne contiendra plus de guillemets.
 
Excuse moi pour mes erreurs :-/
Par contre il risque d'il y avoir un probleme au niveau de :
copy "%folder%\%file:"=%" \test\
a cause des guillemets, donc ben test

Reply

Marsh Posté le 04-09-2007 à 23:01:03   

Reply

Marsh Posté le 05-09-2007 à 21:08:20    

Effectivement, j'ai remis les guillemets sur %%b et %%a pour gérer les espaces dans les noms de dossier et jusqu'a maintenant tout fonctionne bien.
 
Par contre, je me suis lancé dans un autre batch pour renommer les fichiers des répertoires avec des indices et je galère encore.
 
Je voudrais renommer tous les fichiers en I%n%D%k%_%n% pour avoir:
I1/
 I1D1/I1D1_1.txt
        I1D1_2.txt
 I1D2/I1D2_1.txt
        I1D2_2.txt
I2/
 I2D1/I2D1_1.txt
        I2D1_2.txt
 I2D2/I2D2_1.txt
        I2D2_2.txt
Bien sur, je voudrais que le batch scan tous les sous-répertoires, j'essai de suivre l'exemple que tu m'as donné mais j'ai du mal :( Je vais cherché dans le forum, le problème a déjà dû être traité.
 
Merci encore pour ton aide!


Message édité par Dodge_Kowalski le 05-09-2007 à 21:10:29
Reply

Marsh Posté le 05-09-2007 à 22:03:27    

set var=0
::on se place dans le repertoire
cd c:\I\
::pour chaque fichier de ce dossier
for /f "delims=" %%a in ('dir /b /s') do call :cmd "%%a"
exit
:cmd
set file=%~1
::dossier contient le nom du deuxieme dossier (I1D1 ou I1D2 ou I2D1 ou I2D2)
set dossier=%file:~8,4%
::si le dossier n'est plus le meme on raz var
if not "%dossier%"=="%dossierbck%" set var=0
::bck de la variable dossier
set dossierbck=%dossier%
::incrementation de var
set /a var+=1
::on renome le fichier
ren "%file%" "%dossier%_%var%.txt"
 
 
Un truc dans le genre, j'ai pas du tout test le code, donc voila, test ;)
Attention, modifie la ligne set dossier=%file:~8,4% selon le dossier où il est, là c'est pour s'il est dans : C:\I\I1\I1D1\ par exemple


Message édité par blastkiller le 05-09-2007 à 22:05:19
Reply

Marsh Posté le 05-09-2007 à 22:59:29    

Punaise, trop fort !! et en plus tu le sort sans le programmer ?!?
 
Bon, en fait y'a juste un petit 'blème: les fichiers des sous-répertoires
sont bien renommés comme il faut, mais le batch renomme aussi les sous-répertoires en leurs ajoutant un _%var%.txt
 
Au pire, je corrigerais à la main, le plus lourd était le renommage des fichiers qui lui marche impec.
 
Merci Blastkiller http://smileys.sur-la-toile.com/repository/Respect/0008.gif

Reply

Marsh Posté le 05-09-2007 à 23:08:48    

J'ai peut être posté trop vite, je viens de refaire un essai et maintenant la numérotation plante, bizarre...

Reply

Marsh Posté le 06-09-2007 à 18:33:58    

J'ai juste retouché un peu le code et maintenant ça remarche:
http://img339.imageshack.us/img339/8007/capturerol0.jpg

Reply

Marsh Posté le 06-09-2007 à 18:56:52    

set /a k=1
set /a k=k+1
C'est ça que t'as modifié ? normalement pas besoin :-/
 
Et après le FOR, met un EXIT, sinon il executera :cmd une fois la boucle fini.
 
Si ça marche c'est le principale j'crois ^^

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed