Batch ; 'set' d'une variable dans un IF [Résolu/Fermé]

Signaler
Messages postés
28
Date d'inscription
lundi 26 juillet 2010
Statut
Membre
Dernière intervention
17 avril 2014
-
Messages postés
28
Date d'inscription
lundi 26 juillet 2010
Statut
Membre
Dernière intervention
17 avril 2014
-
Bonjour,

Dans un batch, je modifie une variable dans une boucle FOR et un IF imbriqués.

Mais j'ai un problème cette modification de la variable n'est pas prise en compte :

(en amont la commande d'initialisation : set fichier=null)

set fichier=null
for /f %%i In ('dir /b /ad %APPLIS_ROOT_PATH%') Do (
echo %%i
if "%%i" NEQ "DefaultApplication.ear" (
if "%%i" NEQ "query.ear" (
if "%%i" NEQ "ivtApp.ear" (
echo %%i
echo Programme Principal
echo plouf
set fichier=%%i
echo Nom de fichier : %fichier%
echo.
)
)
)
)

La boucle FOR parcourt les noms des répertoires du chemin contenu dans la variable %APPLIS_ROOT_PATH% (préalablement définie).

Etant donné que la structure IF en batch est plus que limitée (pas de AND de OR, de elsif etc ...), je fais des vérifications sur la valeur des variables avant de faire se lancer le Programme Principal.

Le problème se situe au niveau de la récupération de %%i dans une variable temporaire fichier.
fichier se prend le premier nom de répertoire, la boucle continue et le %%i change donc à chaque fois de valeur, mais pas la variable fichier :

clicla1EAR_srvclicla1.ear
clicla1EAR_srvclicla1.ear
Programme Principal
plouf
Nom de fichier : null

clicla2EAR_srvclicla2.ear
clicla2EAR_srvclicla2.ear
Programme Principal
plouf
Nom de fichier : null

DefaultApplication.ear
gtpdev_srvgtpdev.ear
gtpdev_srvgtpdev.ear
Programme Principal
plouf
Nom de fichier : null

gtpint_srvgtpint.ear
gtpint_srvgtpint.ear
Programme Principal
plouf
Nom de fichier : null

gtpmoa_srvgtpmoa.ear
gtpmoa_srvgtpmoa.ear
Programme Principal
plouf
Nom de fichier : null

gtpswf_srvgtpswf.ear
gtpswf_srvgtpswf.ear
Programme Principal
plouf
Nom de fichier : null

ivtApp.ear
pkiintra1EAR_srvpkiintra1.ear
pkiintra1EAR_srvpkiintra1.ear
Programme Principal
plouf
Nom de fichier : null

query.ear
repro1EAR_srvrepro1.ear
repro1EAR_srvrepro1.ear
Programme Principal
plouf
Nom de fichier : null

sepia1EAR_srvsepia1.ear
sepia1EAR_srvsepia1.ear
Programme Principal
plouf
Nom de fichier : null

velinter1EAR_srvvelinter1.ear
velinter1EAR_srvvelinter1.ear
Programme Principal
plouf
Nom de fichier : null

velintra1EAR_srvvelintra1.ear
velintra1EAR_srvvelintra1.ear
Programme Principal
plouf
Nom de fichier : null


Donc en clair la variable fichier, initialisée à null, ne change pas de valeur dans la boucle, malgré le passage régulier de la commande set fichier=%%i

Et le fait de mettre des guillemets ne change rien au problème : set fichier="%%i"

Je suppose que tout ceci est liée à la portée de la variable (globale ou locale), mais je ne trouve pas comment changer le comportement ....

Merci par avance pour votre avis ou toute aide.

3 réponses

Messages postés
18156
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020
4 894
hello
il faut
setlocal enableDelayedExpansion

et dans la boucle, utiliser des ! à la place des % pour la variable
echo Nom de fichier : !fichier!
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 61892 internautes nous ont dit merci ce mois-ci

Messages postés
28
Date d'inscription
lundi 26 juillet 2010
Statut
Membre
Dernière intervention
17 avril 2014

Petite précision, je cherche désormais un moyen de rendre une variable non environnementale.

C'est sans doute le problème que je rencontre, le batch n'est pas en mesure, dès lors que la commande set a créé la variable fichier en tant que variable d'environnement, de la modifier.

Je cherche un truc du genre set envlocal, ou du même style ... si cela dit quelque chose à quelqu'un :-)
Messages postés
28
Date d'inscription
lundi 26 juillet 2010
Statut
Membre
Dernière intervention
17 avril 2014

Salut, oui je préparais une note avec ces deux points justement ^^



Une variable préalablement déclarée, ne peut être modifiée dans une boucle FOR, que via deux conditions :

1- Déclaration avant la boucle de :
========================
setlocal EnableDelayedExpansion

2- Appel de la variable entre deux points ! au lieu de deux %
===========================================

i.e

setlocal EnableDelayedExpansion

for /f %%i In ('dir /b /ad %APPLIS_ROOT_PATH%') Do (

if "%%i" NEQ "DefaultApplication.ear" (
if "%%i" NEQ "query.ear" (
if "%%i" NEQ "ivtApp.ear" (
echo Valeur de i : %%i
set fichier=%%i
echo Valeur de fichier : !fichier!
echo.
)
)
)
)

Dans cet exemple la commande d'affichage suivante fonctionne :
echo Valeur de fichier : !fichier!

Par contre si :

for /f %%i In ('dir /b /ad %APPLIS_ROOT_PATH%') Do (

if "%%i" NEQ "DefaultApplication.ear" (
if "%%i" NEQ "query.ear" (
if "%%i" NEQ "ivtApp.ear" (
echo Valeur de i : %%i
set fichier=%%i
echo Valeur de fichier : %fichier%
echo.
)
)
)
)

Cela ne fonctionne pas, car setlocal n'est pas lancée, et le nom de la variable est entre deux % et non entre deux !



Merci quand même dubcek car si je n'avais pas trouvé par moi-même tu m'aurais retiré l'épine du pied, et même si c'est le but de ce genre de fofo, c'est cool de ta part :-)

Sujet résolu.