Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1410 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1607311
Dodge_Kowa​lski
Chased by the blue
Posté le 02-09-2007 à 19:53:15  profilanswer
 

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
mood
Publicité
Posté le 02-09-2007 à 19:53:15  profilanswer
 

n°1607382
blastkille​r
Posté le 03-09-2007 à 00:27:16  profilanswer
 

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

n°1607438
Dodge_Kowa​lski
Chased by the blue
Posté le 03-09-2007 à 09:37:53  profilanswer
 

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

n°1607518
Dodge_Kowa​lski
Chased by the blue
Posté le 03-09-2007 à 11:21:49  profilanswer
 

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

n°1607577
Dodge_Kowa​lski
Chased by the blue
Posté le 03-09-2007 à 13:09:58  profilanswer
 

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
n°1607631
Dodge_Kowa​lski
Chased by the blue
Posté le 03-09-2007 à 14:49:38  profilanswer
 

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
n°1607711
Dodge_Kowa​lski
Chased by the blue
Posté le 03-09-2007 à 18:33:22  profilanswer
 

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:(

n°1607814
blastkille​r
Posté le 04-09-2007 à 04:11:01  profilanswer
 

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
n°1608277
Dodge_Kowa​lski
Chased by the blue
Posté le 04-09-2007 à 22:21:41  profilanswer
 

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
n°1608291
blastkille​r
Posté le 04-09-2007 à 23:01:03  profilanswer
 

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

mood
Publicité
Posté le 04-09-2007 à 23:01:03  profilanswer
 

n°1608683
Dodge_Kowa​lski
Chased by the blue
Posté le 05-09-2007 à 21:08:20  profilanswer
 

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
n°1608701
blastkille​r
Posté le 05-09-2007 à 22:03:27  profilanswer
 

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
n°1608718
Dodge_Kowa​lski
Chased by the blue
Posté le 05-09-2007 à 22:59:29  profilanswer
 

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

n°1608723
Dodge_Kowa​lski
Chased by the blue
Posté le 05-09-2007 à 23:08:48  profilanswer
 

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

n°1609021
Dodge_Kowa​lski
Chased by the blue
Posté le 06-09-2007 à 18:33:58  profilanswer
 

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

n°1609035
blastkille​r
Posté le 06-09-2007 à 18:56:52  profilanswer
 

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 ^^


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
piloter un fichier excel intégré dans un fichier word[Résolu] Problème d'addition complétement imbécile!
[Résolu] Image en fonction du nom de la page[Résolu] Include PHP mais fixe ... facon iframe (scrollbar)
[RESOLU] VBA Single et Integer[RESOLU] Recherche MySQL un peu complexe
[MAVEN] Question de package avec les sous modules [Resolu][Resolu]Problème de "map"
[Batch] Lancement d'une appli sans bloquer le deroulement de script[RESOLU]INSER INTO si données différentes
Plus de sujets relatifs à : [Batch] [resolu] Copier le premier fichier de chaque sous repertoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR