Copier le premier fichier de chaque sous repertoire [Batch] [resolu] - Shell/Batch - Programmation
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
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 :  | 
 
 
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   De plus, je ne sais pas si je peux passer des paramètres à CD et si le DIR *.* va être accepté...
 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   
 
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 
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!!
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...
 J'ai essayé CD<%a% mais ça foire aussi...
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
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\
Marsh Posté le 04-09-2007 à 22:21:41
| blastkiller a écrit : for /f "delims=" %%a in ('dir /a | 
 
  Merci Blastkiller, ton approche marche aprés quelques petites modif.
 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: 
  
 
Du coup, j'ai enlevé les guillemets sur %%a et %%b puis rajouté c:\test\ dans le copy et ça marche nickel  
  
  
 
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  je n'aurais pas réussi tout seul
 je n'aurais pas réussi tout seul   
  
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 /b') do call :cmd "%%a"
 /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
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é.
 Je vais cherché dans le forum, le problème a déjà dû être traité. 
 
Merci encore pour ton aide!
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
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 
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...
Marsh Posté le 06-09-2007 à 18:33:58
J'ai juste retouché un peu le code et maintenant ça remarche: 
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 ^^
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
Merci d'avance.
Ps: Batch pour NT
Message édité par Dodge_Kowalski le 05-09-2007 à 21:12:55