Chercher deux fichiers dans répertoires différents et variabiliser la résultat
Résolu
Ka-El
Messages postés
260
Date d'inscription
Statut
Membre
Dernière intervention
-
barnabe0057 Messages postés 14455 Date d'inscription Statut Contributeur Dernière intervention -
barnabe0057 Messages postés 14455 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
A voir également:
- Chercher deux fichiers dans répertoires différents et variabiliser la résultat
- Comment réduire la taille d'un fichier - Guide
- Comment faire deux colonnes indépendantes dans word - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Deux ecran pc - Guide
- Renommer des fichiers en masse - Guide
3 réponses
Salut,
Facile à faire mais faut pas être pressé, surtout si tu as une grosse arborescence :
Le fait que les fichiers se trouvent à chaque fois dans bin et runtime est anecdotique, ça ne nous aide en rien.
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.
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.
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 ?
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 :
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.
@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.
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
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 ?
@+
Je vais voir ce qu'on peut faire.