BAT-fichier: contenu de variable dans le cadre d'une autre variable
Supposons que j'ai de la variable un avec le contenu "123" et la variable b123 avec un texte. Pour une raison que je veux utiliser la variable un dans le cadre de la deuxième var nom. Quelque chose comme ceci:
SET a=123
SET b123=some_text_in_it
rem i want next line to output "some_text_in_it"
echo %b%a%%
donc je veux concaténer du texte avec var contenu et l'utilisation qui en résulte chaîne de caractères comme nom de variable à l'écho que le contenu. L'échantillon ci-dessus ne fonctionne pas et je ne vois pourquoi, probablement, j'ai besoin d'ajouter une sorte de groupping. Comment le faire, prefferably dans une ligne?
OriginalL'auteur Aleksandr Kravets | 2012-03-14
Vous devez vous connecter pour publier un commentaire.
Il y a deux méthodes courantes pour cette
CALL
ouDelayedExpansion
La
CALL
variante utilise le fait, qu'un appel d'analyse de la ligne une seconde fois, la première fois que le%a%
sera élargi et le double%%
sera réduite à un seul%
call echo %b123%
Et dans la deuxième étape, les
%b123%
sera élargi.Mais le
CALL
technic est lent et pas très fort, de sorte que le DelayedExpansion doit être préférée.La DelayedExpansion fonctionne comme les points d'exclamation sont développés plus tard dans un analyseur de phase de l'expansion de l'%.
Et c'est aussi la cause, pourquoi expansion retardée est beaucoup plus sûr.
Edit: Méthode pour les tableaux contenant les numéros de
Si vous travaillez avec des tableaux qui ne contient que des nombres, vous pourriez aussi utiliser
set /a
pour y accéder.C'est beaucoup plus facile que le
FOR
ouCALL
technic et cela marche aussi dans les blocs.Bien que
set /a
est utile pour l'accès numérique des éléments de tableau, il ne peut pas utiliser un index modifié de la mêmeset /a
de commande pour les mêmes raisons que vous m'a expliqué ci-dessous. Par exemple:set /a idx+=1, var=arr[!idx!]
n'a pas le droit de l'élément, de sorte que cette gestion doit être réalisé dans les deux séparésset /a
commandes.OriginalL'auteur jeb
La meilleure raison de "l'utilisation d'une variable dans le cadre de la deuxième var nom" est accéder au tableau (vecteur et matrice) des éléments via un indice variable. Bien que ce soit exactement le même que l'exemple ci-dessus, il semble beaucoup plus clair:
Bien que
CALL
est plus lent queDelayed Expansion
, comme jeb dit ci-dessus, il peut être imbriquées à plusieurs reprises, permettant d'utiliser une deuxième (ou plus) d'indirection pour accéder aux éléments du tableau. Cette fonctionnalité peut être utilisée dans des structures de données complexes, comme les listes chaînées. Par exemple:MODIFIER: Pour une raison que je ne comprends pas, l'Expansion Retardée version de la dernière commande ne fonctionne pas correctement:
call echo !w[%%v[%i%]%%]!
va se développer dans le commander. 1.Pour cent de l'expansion decall echo !w[%v[123]%]!
, 2. expansion retardée àcall echo
comme lew[%v[123]%]
n'est pas une variable définie par 3. l'appel sera exécuter et de commencer une nouvelle pour cent de l'expansion. Votre échantillon doit ressembler àcall echo %%w[!v[%i%]!]%%
Btw. Après un expansion retardée ne sera jamais exécutée, a expliqué à DONC:Comment CMD.EXE analyser les scriptseh bien, j'avais similaire de raison d'utiliser cette fonctionnalité. Eu un certain nombre de chaînes localisé en plusieurs langues dans les constantes avec des noms identiques, sauf postfix (par exemple 'my_text_1_de','my_text_1_it'...). Donc, mon objectif était d'attribuer la bonne i18n chaînes à des variables après la langue a été sélectionnée par l'utilisateur.
Bien sûr!: l'expansion retardée est fait avant de l'exécution de la commande, que, dans ce cas (
call
), est responsable de la deuxième extension de signes de pourcentage. Merci beaucoup 🙂Puis-je vous suggérer de joindre l'évolution de la partie du nom de la variable entre crochets comme la norme de tableaux dans d'autres langues? 'my_text_1[de]','my_text_1[elle]", Même si c'est la même chose pour le traitement par Lot, c'est plus clair pour les programmeurs!
Excuse moi, mais la solution qui vous est proposée est une solution de contournement, un tableau pas de soutien que vous pouvez trouver en Python ou Perl ou n'importe quel langage de programmation. Vous pouvez même y penser comme à une table de Hachage( les indices sont des chaînes de caractères, rappelez-vous). Mais Ce n'est pas une VRAIE table de hachage, c'est Q&D solution, utile, intuitif, mais encore une solution de contournement. Peut-être que je suis désapprobation, mais c'est parce que je ne suis pas une vraie chauve-souris-amant, j'ai juste eu à travailler avec Bat-fichier.
OriginalL'auteur Aacini
Il y a encore un moyen de plus pour accomplir la tâche qui est très utile si les deux variables ont été affectés au sein de la même mise entre parenthèses bloc qui est en pleine expansion. La solution est similaire à jeb de l'expansion retardée réponse, sauf qu'il utilise une variable au lieu de la normale expansion.
L'APPEL truc pourrait aussi être utilisé, mais il est relativement très lente, et il n'est pas fiable - voir APPELEZ-moi, ou mieux éviter d'appel.
La définition et l'utilisation d'un saut de ligne variable est traitée à Expliquer comment dos-lot de saut de ligne variable hack fonctionne.
Réglage de la fin de vie d'un saut de ligne est décrit en détail à COMMENT: FOR /F Désactivation de la fin de vie ou à l'aide d'une citation comme delim. À l'aide d'un LF variable au lieu d'incorporer des sauts de ligne dans l'instruction FOR est juste une extension de la technique. Elle rend le code plus lisible.
MODIFIER
Une façon plus simple de les utiliser en toute sécurité de la technique pour être valable, toute valeur est à régler en fin de vie d'un signe égal, car aucune variable définie par l'utilisateur peuvent contenir un = dans le nom.
OriginalL'auteur dbenham