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é...
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...
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 /b') do call :cmd "%%a" |
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
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"
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é.
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