Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rotation variables en batch

5 réponses
Avatar
Youri Ligotmi
Bonjour

Mon problème :
J'ai une liste de données que je voudrais faire circuler dans une
variable d'environnement.
La solution que j'ai mise en place (voir plus bas) ne me plait pas car
pas facilement modifiable (la liste de données est amenée à changer
régulièrement).
Y aurait-il plus simple pour faire ça? genre déclaration de la liste des
données en tête du programme (doit tourner sous 2003R2)

Merci d'avance

YL

Ce que j'ai fait (pour la liste de données : G D 1 3)

var.bat est initalisé avec la ligne suivante set var=G

Programme principal

call var.bat
if "%var%"=="G" goto vg
if "%var%"=="D" goto vd
if "%var%"=="1" goto v1
if "%var%"=="3" goto v3
:TRAITEMENT ERREUR SI ON ARRIVE LA
goto fin
:vg
echo set var=D>var.bat
goto fin
:vd
echo set var=1>var.bat
goto fin
:v1
echo set var=3>var.bat
goto fin
:v3
echo set var=G>var.bat
goto fin
:fin

5 réponses

Avatar
Gilles LAURENT [MVP]
"Youri Ligotmi" wrote:

C'est vrai que l'énoncé n'est pas très clair ;-) Voici toutefois ci-dessous
un script qui répond à MA compréhension du problème.

--- Coupez ici : CodeSnippet.cmd ---
@echo off
setlocal enabledelayedexpansion
call var.bat
for %%i in (GD,D1,13,3G) do (
set item=%%i
if "%var%"=="!item:~0,1!" (
echo set var=!item:~1,1!>var.bat
goto :fin
)
)
echo An error occured !

:fin
endlocal
--- Coupez ici : CodeSnippet.cmd ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
Youri Ligotmi
Bonjour

Gilles LAURENT [MVP] a écrit :
"Youri Ligotmi" wrote:

C'est vrai que l'énoncé n'est pas très clair ;-) Voici toutefois ci-dessous
un script qui répond à MA compréhension du problème.



Je dois avouer que c'est vrai que c'est moyennement clair (c'est pour ça
que j'avais aussi mis mon code), ceci dit votre compréhension du
problème est la bonne, votre script a la fonctionnalité voulue.
J'admire l'astuce de la concaténation des données consécutives (GD, D1,
13, 3G).
Une question : à quoi sert le "setlocal enabledelayedexpansion"
(mes connaissances en batch remontent au dos 3.3 et je n'ai pas encore
enregistré toutes les évolutions).
Merci encore.

YL

--- Coupez ici : CodeSnippet.cmd ---
@echo off
setlocal enabledelayedexpansion
call var.bat
for %%i in (GD,D1,13,3G) do (
set item=%%i
if "%var%"=="!item:~0,1!" (
echo set var=!item:~1,1!>var.bat
goto :fin
)
)
echo An error occured !

:fin
endlocal
--- Coupez ici : CodeSnippet.cmd ---



Avatar
Gilles LAURENT [MVP]
"Youri Ligotmi" wrote:
Bonjour



Bonjour,

[...]
Une question : à quoi sert le "setlocal enabledelayedexpansion"
(mes connaissances en batch remontent au dos 3.3 et je n'ai pas encore
enregistré toutes les évolutions).



Premier exemple sans expansion retardée :

---
@echo off
set var¾fore
if 1==1 (
set var¯ter
echo [var=%var%]
)
---

Affichera var¾fore car la variable d'environnement %var% est résolue lors
de la lecture du bloc if. Lors de la lecture du bloc if, var est bien égale à
before.

Second exemple avec expansion retardée :

---
@echo off
setlocal enabledelayedexpansion
set var¾fore
if 1==1 (
set var¯ter
echo [var=!var!]
)
endlocal
---

Affichera var¯ter car la variable d'environnement !var! est résolue cette
fois-ci lors de la lecture de la ligne. Lors de la lecture de la ligne, var
est bien égale à after car la ligne précédent définie var à after.

En espérant avec été suffisamment clair ;-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
Youri Ligotmi
Gilles LAURENT [MVP] a écrit :
"Youri Ligotmi" wrote:
Bonjour



Bonjour,

[...]
Une question : à quoi sert le "setlocal enabledelayedexpansion"
(mes connaissances en batch remontent au dos 3.3 et je n'ai pas encore
enregistré toutes les évolutions).



Premier exemple sans expansion retardée :

---
@echo off
set var¾fore
if 1==1 (
set var¯ter
echo [var=%var%]
)
---

Affichera var¾fore car la variable d'environnement %var% est résolue lors
de la lecture du bloc if. Lors de la lecture du bloc if, var est bien égale à
before.

Second exemple avec expansion retardée :

---
@echo off
setlocal enabledelayedexpansion
set var¾fore
if 1==1 (
set var¯ter
echo [var=!var!]
)
endlocal
---

Affichera var¯ter car la variable d'environnement !var! est résolue cette
fois-ci lors de la lecture de la ligne. Lors de la lecture de la ligne, var
est bien égale à after car la ligne précédent définie var à after.

En espérant avec été suffisamment clair ;-)



Merci pour ces explications, j'ai compris que sans le "setlocal
enabledelayedexpansion" la modification du contenu d'une variable dans
une boucle if n'a pas d'effet.
Merci encore pour votre aide.

YL
Avatar
Gilles LAURENT [MVP]
"Youri Ligotmi" a écrit dans le message de
news:4970b64a$0$24817$
| Merci pour ces explications, j'ai compris que sans le "setlocal
| enabledelayedexpansion" la modification du contenu d'une variable dans
| une boucle if n'a pas d'effet.

Votre résumé est correct.
Toutefois cela s'applique à tous les blocs d'intructions.
Par exemple :

---
@echo off
set var¾fore
(
set var¯ter
echo %var%
)
---

Affichera var¾fore car l'expansion retardée n'est pas fixée. De plus,
si l'expansion retardée est activée alors la variable d'environnement
"var" devra obligatoirement être encadrée du caractère "!" à la place du
caractère "%" pour que l'interpréteur de commandes %comspec% (i.e
cmd.exe) sache gérer cette situation. Il faut donc considérer
l'expansion retardée comme une lecture séquentiel du fichier batch. Ce
mode de fonctionnement est à mon avis le plus naturel. Je vous invite
donc à toujours activer cette option.

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr