[BATCH] for imbriqué recherche dossier

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Pierre Goudat
Batcheur occasionnel
Messages : 9
Enregistré le : 27 juil. 2017 16:37

[BATCH] for imbriqué recherche dossier

Message 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,
barnabe0057
SuperBatcher
Messages : 105
Enregistré le : 24 janv. 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Message 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
Pierre Goudat
Batcheur occasionnel
Messages : 9
Enregistré le : 27 juil. 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Message 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 ?
barnabe0057
SuperBatcher
Messages : 105
Enregistré le : 24 janv. 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Message 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
Pierre Goudat
Batcheur occasionnel
Messages : 9
Enregistré le : 27 juil. 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Message 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é.
barnabe0057
SuperBatcher
Messages : 105
Enregistré le : 24 janv. 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Message par barnabe0057 »

Effectivement il y a un petit malentendu, je vais voir ce que je peux faire.
Pierre Goudat
Batcheur occasionnel
Messages : 9
Enregistré le : 27 juil. 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Message 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.
barnabe0057
SuperBatcher
Messages : 105
Enregistré le : 24 janv. 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Message 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
Pierre Goudat
Batcheur occasionnel
Messages : 9
Enregistré le : 27 juil. 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

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

Code : Tout sélectionner

'2^>nul dir /b /s "%~1\*.%~2"'
ensuite ici :

Code : Tout sélectionner

findstr /i "librairies instrument"
nous listons les nom de dossier à exclure ?


enfin quelle est l'utilité de cette ligne ? :

Code : Tout sélectionner

chcp 1252 > nul
je vais essayer cette solution de suite.
barnabe0057
SuperBatcher
Messages : 105
Enregistré le : 24 janv. 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

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

Code : Tout sélectionner

chcp 1252 > nul
sert à afficher correctement les caractères accentués, notamment le "Traitement terminé" que j'ai mis à la fin.

Code : Tout sélectionner

findstr /i "librairies instrument"
sert effectivement à indiquer les dossiers à exclure

Code : Tout sélectionner

'2^>nul dir /b /s "%~1\*.%~2"'
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
Répondre