Comment utiliser des variables dans des variables? Ce code:
set newvar=%var%var2%%
ne fonctionne pas. Alors que faire? Je ne peux pas écrire mon programme sans celui-ci.
Comment utiliser des variables dans des variables? Ce code:
set newvar=%var%var2%%
ne fonctionne pas. Alors que faire? Je ne peux pas écrire mon programme sans celui-ci.
Réponses:
Je suis d'accord avec AFH; vous devez obtenir que CMD «double analyse» la set
déclaration. Mais j'ai trouvé un moyen de le faire sans faire appel à un fichier de commandes temporaire (ou en examinant chaque variable pour trouver celle que vous voulez). Il utilise un sous-programme et une astuce appelée expansion variable différée. Activer l'expansion retardée en ajoutant
setlocal enabledelayedexpansion
quelque part vers le début de votre fichier de commandes. Le but de l’expansion retardée des variables est quelque peu compliqué - voir SET /?
et SETLOCAL /?
pour plus d’informations - mais il est important de savoir que cela vous permet de référencer des variables en plus de .!variable_name!
%variable_name%
Alors on y va:
@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof
:kludge
set newvar=!%1!
exit /b
Lorsque nous sautons à :kludge
, l'instruction est d'abord transformée en set newvar=!var2!
(car %1
, le premier argument du sous-programme, est var2
), puis set newvar=orange
(comme si l'instruction avait été set newvar=%var2%
). Alors newvar
se prépare à orange
.
BTW, goto :eof
et exit /b
sont interchangeables. Si elles sont appelées depuis un sous-programme (c’est-à-dire à un endroit où vous avez une call
déclaration), elles renverront l’appelant. Sinon, ils agissent comme un saut vers la fin du fichier de commandes, entraînant la fin du travail par lots sans supprimer la commande parent, interactive, d'invite de commande.
:kludge
routine. Vous pouvez simplement utiliser set "newvar=!var%A%!"
, comme je l'ai démontré dans ma réponse .
Une méthode relativement lente. La commande CALL fournit un niveau supplémentaire d’expansion des variables. Les pourcentages autour du nom de la variable externe sont doublés pour retarder l'expansion après que la variable interne ait été développée.
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
Une méthode bien meilleure consiste à utiliser une expansion retardée. Il doit d'abord être activé avec SETLOCAL ENABLEDELAYEDEXPANSION. La variable dans les pourcentages est développée lorsque la ligne est analysée. La variable entre les points d'exclamation est étendue après l'analyse, juste avant que la ligne soit exécutée.
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
set newvar=%var!A!%
- si proche, mais pas de cigare!
%var!A!%
échec et le !var%A%!
fonctionnement est assez simple une fois que vous connaissez l'ordre des différentes phases d'expansion.
Généralement, j'essayerais d'éviter des scénarios comme celui-ci. Bien que ce soit possible, il est loin d’être performant et difficile à lire non plus - vous devez en principe analyser le résultat de la set
commande.
set index=9
set var9=Goal
echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%
delims
fractionnements% I% en avant = et% J% en après =, et = ne peuvent pas être dans les noms de variable AFAIK.
in (set var%index%)
que j'avais en train de fouiller dans ma tête. La seule situation dans laquelle votre solution ne fonctionnerait pas serait si la valeur commençait par =
. Je ne suis pas sûr de savoir quand l'expansion retardée a été introduite, mais je soupçonne que le CALL avec des pourcentages doublés fonctionnerait dans NT4.
echo set newvar=%%var%var2%>temp.cmd
, alors.\temp.cmd
. Un peu lourd, mais ça marche.