Comment développer deux fois une variable de shell CMD (récursivement)
À l'aide de la Windows XP CMD ligne de commande je peux développer une variable à deux reprises comme suit:
set AAA=BBB
set BBB=CCC
for /F "usebackq tokens=*" %i in (`echo %%AAA%%`) do echo %i
se fera l'écho de CCC
. I. e. AAA
a été étendue à toute la chaîne de BBB
puis la variable BBB
a été élargi pour CCC
.
Cela ne fonctionne pas à partir à l'intérieur d'un script batch (c'est à dire une .fichier cmd). La modification de la %%AAA%%
soit %%%AAA%%%
ou %%%%AAA%%%%
ne fonctionne pas non plus.
Une idée de comment je peux obtenir ce à partir d'un script, à savoir prendre élargir la variable AAA pour la chaîne de la CCC?
La Fin De Modifier
Les réponses postées travailler pour mon exemple réduit cependant la non-tortueux réponse ne fonctionne pas pour le cas réel. Voici un exemple (qui ne fonctionne pas), qui illustre ce que j'étais en train d'essayer de faire:
setlocal enabledelayedexpansion
set LIST=BBB CCC DDD
set BBB=111
set CCC=222
set DDD=333
for %%i in (%LIST%) do (
for /F %%a in ('echo %%%i%') do echo !%%a!
)
Je voudrais voir
111
222
333
de sortie.
source d'informationauteur jon-hanson
Vous devez vous connecter pour publier un commentaire.
De penser en termes de moins tortueux de la solution, cela, aussi, produit le
CCC
que vous désirez.edit:
de disséquer cette réponse:
setlocal enabledelayedexpansion
- ce qui vous permettra de tout paramètre variable d'environnement au cours de votre batte pour être utilisé tel que modifié au cours du processus de votrefor
boucle.set AAA=BBB
set BBB=CCC
- vos données de populationset
étatsfor /F %%a in ('echo %AAA%') do echo !%%a!
- Ceci indique que le processeur de la boucle, mais une seule fois, et de prendre le premier jeton qui est retournée (délimiteur par défaut de l'espace et onglet s'appliquent) à partir de l'exécution de la commande dans les parens et le mettre dans le var %%(en dehors d'un lot, d'un seul%). Si vous spécifiez que le var en %%a, vous avez besoin d'utiliser le %de %de un dans votredo
bloc. De même, si vous spécifiez %%i, utiliser %%i dans votredo
bloc. La Note pour obtenir votre variable d'environnement pour être résolus au sein de lado
bloc de lafor
boucle, vous devez l'entourer dans!
'. (vous n'avez pas besoin de lain
bloc, comme je l'ai posté - j'ai fait que changer dans mon édition).edit:
Vous étiez très proche avec la mise à jour de votre exemple. Essayez comme ceci:
La différence entre votre mise à jour et c'est que vous essayiez de l'echo de la variable d'environnement dans le
in
ensemble avecin ('echo %%%i%')
mais sans le!
's pour l'expansion retardée des variables. Avez-vous été à l'utilisationin ('echo !%%i!')
vous verriez votreBBB
CCC
etDDD
variables résolu, mais alors ledo
bloc de votre boucle interne wouldnt ont rien à résoudre - vous n'avez pas la moindre111
variables d'environnement. Avec cela à l'esprit, vous pouvez simplifier votre boucle avec les éléments suivants:Comment développer une variable d'environnement à plusieurs reprises:
de sortie:
Suivantes (tortueux) approche semble fonctionner ok:
Il sorties:
comme souhaité.
J'ai souvent utilisé cette astuce pour (par exemple) format
%aaa%
en%x%
à une certaine taille (à lasprintf
) mais c'est la première fois que j'ai eu à faire un double indirection. Il fonctionne parce que vous ne trouverez pas de l'extra"%%"
aspiré par le shell en cours.Cette aaa.chauve-souris
sorties
Quel est exactement le problème?
C'est un peu daté question, mais, fait intéressant, la réponse est plus simple maintenant. Je suis de l'exécution de ces scripts sur Windows 10:
sorties
Pour la version élargie, cela fonctionne:
sorties
Double indirection (qui est un très apt façon
pax
a) rappelle C pointeur de référence.Je doute que ce soit pris en charge dans le Shell de commande Windows.
Pensez-vous que le plus grand but que vous visez peut être réalisé avec quelque chose de plus facile;
peut-être moindre d'un code-golf approche, puis le inventée bien par
pax
?il semble que la meilleure chose à faire est de créer un petit fichier temporaire pour définir la variable que vous le souhaitez. quelque chose comme ceci devrait fonctionner: