Chercher deux fichiers dans répertoires différents et variabiliser la résultat
Résolu
Ka-El
Messages postés
279
Statut
Membre
-
barnabe0057 Messages postés 14329 Date d'inscription Statut Contributeur Dernière intervention -
barnabe0057 Messages postés 14329 Date d'inscription Statut Contributeur Dernière intervention -
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
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
-
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.
-
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 ?
@+
-
-
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
-
-
Cette commande modifie le codepage, elle est généralement utilisée pour afficher correctement les caractères accentués.
Si le script ne fonctionne pas, à mon avis ça provient du filtre de la commande FINDSTR.
En effet il y a une bizarrerie dans ta demande : les arborescences windows utilisent le \ tandis que les arborescences GNU/Linux utilisent le / . Ce script est un script windows mais toi tu cherches une arborescence Linux, je ne comprends pas très bien. -
Tu as raison nous sommes bien sur du "\"
Ma demande initiale était correcte mais pas ma réponse qui a suivi (c'est mon côté étourdi ça !)
En fait, de mon côté quand je lance ton script, la recherche a l'air de bien se faire mais celle-ci n'affiche au final aucun résultat (alors que j'ai bien mes deux fichiers toto.bat dans les arborescences ~\bin et ~\runtime)
Est-ce que ton script est fonctionnel dans n'importe quel emplacement du serveur ? -
-
-
-
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.
-
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 ! :-)- 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
-
-