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.
batch-file
utilisateur339962
la source
la source
echo set newvar=%%var%var2%>temp.cmd
, alors.\temp.cmd
. Un peu lourd, mais ça marche.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 ajoutantquelque 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 /?
etSETLOCAL /?
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:
Lorsque nous sautons à
:kludge
, l'instruction est d'abord transformée enset newvar=!var2!
(car%1
, le premier argument du sous-programme, estvar2
), puisset newvar=orange
(comme si l'instruction avait étéset newvar=%var2%
). Alorsnewvar
se prépare àorange
.BTW,
goto :eof
etexit /b
sont interchangeables. Si elles sont appelées depuis un sous-programme (c’est-à-dire à un endroit où vous avez unecall
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.la source
:kludge
routine. Vous pouvez simplement utiliserset "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.
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.
la source
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.la source
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.