Chercher deux fichiers dans répertoires différents et variabiliser la résultat [Résolu/Fermé]

Signaler
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020
-
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
-
Bonjour,
Me voici de nouveau avec mes problématiques de batch...
J'ai l'impression d'être encore devant un cas insurmontable. Alors j'espère que vous allez pouvoir m'aider.

Voilà actuellement je cherche les 2 fichiers suivants:
~/bin/toto.bat
~/runtime/toto.bat

Comme dans mon exemple, les deux fichiers portent toujours le même nom et sont toujours situés dans les sous-dossiers "bin" et "runtime"
Mon problème, c'est que les arborescences peuvent être alléatoires. Exemple :
C:\bateau\maison\bin\toto.bat
ou
C:\cherche\tu\trouveras\bin\toto.bat
ou
D:\alors\tu\trouves\runtime\toto.bat (Ah oui, les fichiers peuvent aussi être situés sur le disque C: ou D:)
ou
C:\cest\pas\facile\hein\runtime\toto.bat
etc...

Et pour corser le tout, il faut que le code variabilise les deux résultats qui seront trouvés:
exemple:
echo %resultat1%
C:\cherche\tu\trouveras\bin\toto.bat
echo %resultat2%
D:\cest\pas\facile\hein\runtime\toto.bat

Pas simple non ?
En tout cas, moi je patine...
je compte sur vous :-)
Ka-El

3 réponses

Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444
Salut,

Facile à faire mais faut pas être pressé, surtout si tu as une grosse arborescence :

@echo off
Setlocal EnableExtensions DisableDelayedExpansion
chcp 28591 >nul

call :recherche "toto.bat" resultat1
call :recherche "titi.bat" resultat2

echo. & echo Resultat1 = %resultat1%
echo. & echo Resultat2 = %resultat2%

echo. & pause
exit


:recherche

for %%A in (C,D) do (

%%A:
for /f "delims=" %%J in ('2^>nul dir /b /a-d /s %1') do set %2=%%J

)

goto :eof

Le fait que les fichiers se trouvent à chaque fois dans bin et runtime est anecdotique, ça ne nous aide en rien.
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Salut Barnabe,
Toujours aussi efficace à ce que je vois ! :-)

Ceci dit, tu as omis un détail important dans ton code:
Les deux fichiers ont, en effet, le même nom ("toto.bat") et les seuls qui m'intéressent sont situé dans les sous-dossiers ~/bin et ~/runtime
Je précise les dossiers, car il peut très bien y avoir d'autres fichiers "toto.bat" sur mon serveur mais dans d'autres répertoires (et qui donc ne m'intéressent pas)

Tu as une idée ?
@+
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Ah ok, donc ce n'est pas si anecdotique que ça finalement ;)

Je vais voir ce qu'on peut faire.
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444
Voilà la nouvelle version :
@echo off
Setlocal EnableExtensions EnableDelayedExpansion
chcp 28591 >nul

set cible=toto.bat

for %%A in (C,D) do (

%%A:

for /f "delims=" %%J in ('2^>nul dir /b /a-d /s "%cible%"') do (

(echo %%~pnxJ | findstr "bin\\%cible%" >nul) && set resultat1=%%J
(echo %%~pnxJ | findstr "runtime\\%cible%" >nul) && set resultat2=%%J

)
)

echo. & echo Resultat1 = !resultat1!
echo. & echo Resultat2 = !resultat2!

echo. & pause
exit

Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Ok pour le \ le script devrait donc fonctionner.

Le script cherche dans C: et D: comme demandé initialement, il peut être lancé de n'importe quel endroit.
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

J'ai refait l'essai, mais je confirme ça ne marche pas:


De ton côté, c'est OK ?

Actuellement les deux fichiers toto.bat recherchés sont sous:
C:\TRI\Crossfic_TRI\runtime
C:\entreprise\bck_dowload\bin

merci ! :-)
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Est-ce que le fichier toto.bat possède des attributs particuliers ? (archive, fichier système, ...)

Est-ce que l'utilisateur qui lance le script a la permission de lecture pour ces arborescences ?

Est-ce que cette ligne est bien présente : Setlocal EnableExtensions EnableDelayedExpansion

Essaye de rajouter le commutateur /i à la commande FINDSTR :
(echo %%~pnxJ | findstr /i "bin\\%cible%" >nul) && set resultat1=%%J
(echo %%~pnxJ | findstr /i "runtime\\%cible%" >nul) && set resultat2=%%J
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

J'ai recréé les fichiers pour être sûr de ne pas être confronté à un pb de droits.
La ligne Setlocal EnableExtensions EnableDelayedExpansion est bien présente.
J'ai ajouté le /i comme tu me l'as indiqué, mais le script ne renvoit toujours aucun résultat.
je précise que je lance le script en tant qu'administrateur.

C'est d'autant plus bizarre, si de ton côté tu parviens à faire aboutir le code
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Je n'ai pas besoin de le lancer en admin.

Je viens de remarquer un problème en lançant une commande directement dans la console, je vais corriger le script car le problème vient sûrement de là.
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444
Voilà la correction du problème :
@echo off
Setlocal EnableExtensions EnableDelayedExpansion
chcp 28591 >nul

set cible=toto.bat

for %%A in (C,D) do (

echo %CD% | find /i "%%A:" && cd\ || %%A:

for /f "delims=" %%J in ('2^>nul dir /b /a-d /s "%cible%"') do (

(echo %%~pnxJ | findstr /i "bin\\%cible%" >nul) && set resultat1=%%J
(echo %%~pnxJ | findstr /i "runtime\\%cible%" >nul) && set resultat2=%%J

)
)

echo. & echo Resultat1 = !resultat1!
echo. & echo Resultat2 = !resultat2!

echo. & pause
exit

J'espère que c'est bon cette fois-ci.

Le problème vient de la commande pour changer de disque (C: ou D:), en fait si on se trouve déjà sur C: mais qu'on veut remonter à la racine, la commande C: n'a aucun effet il faut utiliser cd\ à la place.


“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Ah ouais ! c'est bien mieux :-)
Par contre, (je vais être un peu chiant), sais-tu pourquoi quand on lance le programme, on a la ligne "C:\Windows\system32" qui s'affiche en haut de la fenêtre de recherche ?

Sinon, c'est nickel.
J'apprécie beaucoup ton aide. Encore merci ! :-)
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Voilà une correction :

@echo off
Setlocal EnableExtensions EnableDelayedExpansion
chcp 28591 >nul

set cible=toto.bat

for %%A in (C,D) do (

(echo %CD% | find /i "%%A:" >nul) && cd\ || %%A:

for /f "delims=" %%J in ('2^>nul dir /b /a-d /s "%cible%"') do (

(echo %%~pnxJ | findstr /i "bin\\%cible%" >nul) && set resultat1=%%J
(echo %%~pnxJ | findstr /i "runtime\\%cible%" >nul) && set resultat2=%%J

)
)

echo. & echo Resultat1 = !resultat1!
echo. & echo Resultat2 = !resultat2!

echo. & pause
exit
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Ah bizarre, il me semblait que je n'avais pas cette ligne précédemment.
En tout cas, encore merci.
Bon week-end et peut être à bientôt pour de nouvelles aventures ;-)
Messages postés
12672
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
9 août 2020
3 444 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Merci bon week-end également !

A bientôt.