[BATCH] for imbriqué recherche dossier

Une difficulté, une précision posez vos questions

Modérateur: WIN32-[GG]

[BATCH] for imbriqué recherche dossier

Messagede Pierre Goudat le 27 Juil 2017 16:41

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,
Pierre Goudat
Batcheur occasionnel
 
Messages: 9
Inscription: 27 Juil 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Messagede barnabe0057 le 27 Juil 2017 18:36

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
barnabe0057
King Of Batch
 
Messages: 35
Inscription: 24 Jan 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Messagede Pierre Goudat le 28 Juil 2017 18:33

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 ?
Pierre Goudat
Batcheur occasionnel
 
Messages: 9
Inscription: 27 Juil 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Messagede barnabe0057 le 29 Juil 2017 23:21

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
barnabe0057
King Of Batch
 
Messages: 35
Inscription: 24 Jan 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Messagede Pierre Goudat le 31 Juil 2017 11:48

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é.
Pierre Goudat
Batcheur occasionnel
 
Messages: 9
Inscription: 27 Juil 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Messagede barnabe0057 le 31 Juil 2017 11:59

Effectivement il y a un petit malentendu, je vais voir ce que je peux faire.
barnabe0057
King Of Batch
 
Messages: 35
Inscription: 24 Jan 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Messagede Pierre Goudat le 31 Juil 2017 12:06

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.
Pierre Goudat
Batcheur occasionnel
 
Messages: 9
Inscription: 27 Juil 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Messagede barnabe0057 le 31 Juil 2017 14:05

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
barnabe0057
King Of Batch
 
Messages: 35
Inscription: 24 Jan 2017 13:41

Re: [BATCH] for imbriqué recherche dossier

Messagede Pierre Goudat le 31 Juil 2017 14:14

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.
Pierre Goudat
Batcheur occasionnel
 
Messages: 9
Inscription: 27 Juil 2017 16:37

Re: [BATCH] for imbriqué recherche dossier

Messagede barnabe0057 le 31 Juil 2017 14:47

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
barnabe0057
King Of Batch
 
Messages: 35
Inscription: 24 Jan 2017 13:41

Suivante

Retourner vers Création de batchs, problèmes...

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron