Page 1 sur 2
[BATCH] for imbriqué recherche dossier
Posté : 27 juil. 2017 16:41
par Pierre Goudat
Bonjour à tous,
j'ai besoin pour un projet d'écrire un code batch avec une imbrication de boucle for. j'ai du mal à trouver une solution concernant la première boucle. Voila ce que je souhaite faire :
Rechercher dans un workspace tous les dossiers appelés (sources ou source ou Source ou Sources) (dossier ou sous dossier) puis pour chaque dossier sources trouvés, copier tous les *.c et les copier dans un autre dossier. Pour la seconde partie c'est déja mis en place et ça fonctionne, mais je bloque sur la première partie, le "trouver tous les dossiers sources"
voici le code jusqu'a présent :
Code : Tout sélectionner
for /r "%WORKSPACE%" %%a in (Sources, sources, Source, source) do (
for /r "%%a" %%m in (*.c) do (
xcopy "%%m" "%WORKSPACE%\KW_TMP\" /D /Y >> "%WORKSPACE%\KW_LOG.txt"
)
)
Merci d'avance pour votre aide.
Bonne journée,
Re: [BATCH] for imbriqué recherche dossier
Posté : 27 juil. 2017 18:36
par barnabe0057
Bonjour,
Essaie comme ça :
Code : Tout sélectionner
@echo off
setlocal enableextensions
set WORKSPACE=ton dossier
cd /d %WORKSPACE%
for %%A in (Sources,sources,Source,source) do (
for /f "tokens=*" %%G in ('dir /b /s "%%~A"') do (xcopy "%%~G\*.c" "%WORKSPACE%\KW_TMP\" /D /Y >> "%WORKSPACE%\KW_LOG.txt")
)
pause
endlocal
exit
Re: [BATCH] for imbriqué recherche dossier
Posté : 28 juil. 2017 18:33
par Pierre Goudat
Bonjour,
Merci de votre aide. Je souhaite également rechercher tous le dossiers "sources" mais pas plus loin que 2 ou 3 sous niveau du workspace. avez vous une idée ?
Re: [BATCH] for imbriqué recherche dossier
Posté : 29 juil. 2017 23:21
par barnabe0057
Avec 3 niveaux de profondeur :
Code : Tout sélectionner
@echo off
setlocal enableextensions
set WORKSPACE=ton dossier
cd /d %WORKSPACE%
rem
rem Niveau racine
rem
call :copie "%cd%"
rem
rem Niveau 1
rem
for /f "tokens=*" %%A in ('dir /b /ad "%cd%"') do (
echo %%A | findstr /i "sources source" > nul && call :copie "%%~dpnA"
rem
rem Niveau 2
rem
for /f "tokens=*" %%B in ('dir /b /ad "%%~dpnA"') do (
echo %%B | findstr /i "sources source" > nul && call :copie "%%~dpnA\%%~B"
rem
rem Niveau 3
rem
for /f "tokens=*" %%C in ('dir /b /ad "%%~dpnA\%%~B"') do (
echo %%C | findstr /i "sources source" > nul && call :copie "%%~dpnA\%%~B\%%~C"
)
)
)
echo. & pause
endlocal
exit
:copie
echo. & echo. & echo ### %~1 ###
2>nul xcopy /D /Y "%~1\*.c" "%WORKSPACE%\KW_TMP\"
goto :eof
rem
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 11:48
par Pierre Goudat
Merci de votre aide, cependant je n'ai pas l'impression qu'une fois dans le dossier source (fonction copie) le programme charge récursivement tous les *.c dans le dossier.
J'aimerais en effet que la recherche de dossier source s'effectue jusqu’à 3 sous niveau de workspace, cependant une fois que l'on est dans le dossier source et que l'on copie les *.c, nous le fassions pour tous les dossiers présents dans le dossier sources :
Code : Tout sélectionner
Workspace
=> Projet_1
=> sources
=> Dossier1
=> 1.c
=> 2.c
=> 3.c
=> 4.c
=> Dossier2
=> 1.c
=> 2.c
=> 3.c
=> 4.c
Dans ce cas, je souhaite que tous les *.c soit copié dans le dossier spécifié.
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 11:59
par barnabe0057
Effectivement il y a un petit malentendu, je vais voir ce que je peux faire.
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 12:06
par Pierre Goudat
Pour expliquer totalement mon problème:
J'ai un workspace pouvant contenir soit un seul projet (un dossier source, des dossiers librairies et instruments) soit plusieurs projets (même chose avec un dossier à la racine du workspace par projet). Je souhaite récupérer tous les *.c et *.h des fichiers sources pour ensuite les placer dans le dossier KW_TMP. Cependant dans l'arborescence du workspace on retrouve également des dossiers librairies et instruments contenant également des *.c et *.h et contenant également parfois des dossiers sources.
Voila tout mon problème. J'ai dans un premier temps récupéré tous les *.c et *.h sans exception, cependant je récupérais tous les fichiers d'instruments et de librairies. j'ai ensuite ciblé seulement les *.c et *.h contenus dans les dossiers appelés "sources" cependant il y a également des fichiers de ce genre dans le dossiers de librairies et instruments. Désormais j'essaie de limiter à quelques sous niveau du workspace, car les sources sont généralement un niveau au dessus des dossiers instruments..
Cependant peut être que vous avez une idée pour me simplifier la vie ? récupérer tous les fichiers *.c et *.h des dossiers sources, cependant si le dossier sources est présent dans un dossier appelé "librairies" ou "instrument" on l'ignore ?
Code : Tout sélectionner
WORKSPACE
=> projet1
=> Sources
=> dossiers source1
=>fichiers *.c/*.h que je veux récupérer
=> dossier source2
=>fichiers *.c/*.h que je veux récupérer
=> librairies
=>lib1
=>sources
=> fichiers *.c/*.h que je veux ignorer
=> Instruments
=>instru1
=>sources
=> fichiers *.c/*.h que je veux ignorer
Merci d'avance et bonne journée.
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 14:05
par barnabe0057
Voilà des informations très utiles, donc on ne peut pas se baser sur les dossiers "sources", on va donc simplifier tout cela en cherchant récursivement dans tout le WORKSPACE les fichiers .c et .h
On va simplement exclure les fichiers dont le chemin comporte la chaine "librairies" ou la chaine "instrument"
Ce qui nous donne ceci :
Code : Tout sélectionner
@echo off
chcp 1252 > nul
setlocal enableextensions
set WORKSPACE=D:\Pierre\Toto
set destination=%WORKSPACE%\KW_TMP\
if not exist "%destination%" (mkdir "%destination%")
cd /d %WORKSPACE% || goto :eof
for /f "tokens=*" %%A in ('dir /b /ad "%cd%"') do (
call :copie "%%~dpnA" c
call :copie "%%~dpnA" h
)
echo. & echo ### Traitement terminé
echo. & pause
endlocal
exit
:copie
for /f "tokens=*" %%E in ('2^>nul dir /b /s "%~1\*.%~2"') do (
(echo %%~dpE | findstr /i "librairies instrument" > nul) || (
echo. & echo. & echo ### %%~dpE
xcopy /D /Y "%%~E" "%destination%"
)
)
goto :eof
rem
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 14:14
par Pierre Goudat
Barnabe,
un énorme merci pour votre aide et votre réactivité ! C'est vraiment très aimable.
Je vais essayer cette solution. Pourrais-je avoir quelques explications sur les points suivants ? :
Code : Tout sélectionner
for /f "tokens=*" %%A in ('dir /b /ad "%cd%"') do (
call :copie "%%~dpnA" c
call :copie "%%~dpnA" h
)
nous pourrions faire de cette façon également ? :
Code : Tout sélectionner
for /r "%WORKSPACE%" %%a in (*.c) do (
call :copie
)
for /r "%WORKSPACE%" %%a in (*.h) do (
call :copie
)
en ce qui concerne cette section :
Code : Tout sélectionner
:copie
for /f "tokens=*" %%E in ('2^>nul dir /b /s "%~1\*.%~2"') do (
(echo %%~dpE | findstr /i "librairies instrument" > nul) || (
echo. & echo. & echo ### %%~dpE
xcopy /D /Y "%%~E" "%destination%"
)
)
je ne comprend pas :
ensuite ici :
nous listons les nom de dossier à exclure ?
enfin quelle est l'utilité de cette ligne ? :
je vais essayer cette solution de suite.
Re: [BATCH] for imbriqué recherche dossier
Posté : 31 juil. 2017 14:47
par barnabe0057
Oui tu peux utiliser FOR /R si tu préfères, ce qui donne ceci :
Code : Tout sélectionner
@echo off
chcp 1252 > nul
setlocal enableextensions
set WORKSPACE=D:\Pierre\Toto
set destination=%WORKSPACE%\KW_TMP\
if not exist "%destination%" (mkdir "%destination%")
cd /d %WORKSPACE% || goto :eof
for /r "%WORKSPACE%" %%A in (*.c) do (call :copie "%%~A")
for /r "%WORKSPACE%" %%A in (*.h) do (call :copie "%%~A")
echo. & echo ### Traitement terminé
echo. & pause
endlocal
exit
:copie
(echo %~dp1 | findstr /i "librairies instrument" > nul) || (
echo. & echo. & echo ### %~dp1
xcopy /D /Y "%~1" "%destination%"
)
goto :eof
rem
Concernant tes autres questions :
sert à afficher correctement les caractères accentués, notamment le "Traitement terminé" que j'ai mis à la fin.
sert effectivement à indiquer les dossiers à exclure
sert à lister récursivement les fichiers portant l'extension (%~2) dans le dossier (%~1). Le 2^>nul sert à supprimer les erreurs générées par la commande dir