Définition et utilisation d'une variable dans un fichier batch

450

J'essaie de définir et d'utiliser une variable dans un fichier de commandes. Il semble que cela devrait être simple:

@echo off

set location = "bob"
echo We're working with "%location%"

La sortie que j'obtiens est la suivante:

We're working with ""

Que se passe t-il ici? Pourquoi ma variable n'est-elle pas reproduite?

Jamie Dixon
la source

Réponses:

552

L'espace avant le =est interprété comme faisant partie du nom et l'espace après celui-ci (ainsi que les guillemets) sont interprétés comme faisant partie de la valeur. Ainsi, la variable que vous avez créée peut être référencée avec %location %. Si ce n'est pas ce que vous voulez, supprimez les espaces supplémentaires dans la définition.

Brian Nixon
la source
7
Si l'espace précédant =est interprété comme faisant partie du nom, la variable ne peut pas être référencée comme %location%, elle doit être référencée comme %location %. Est-ce une faute de frappe?
Miserable Variable
7
@Miserable Variable: vous avez raison; il semble que la réponse originale ait été victime d'une modification incorrecte.
Brian Nixon
18
C'est donc ce que MS est venu avec
Falaque
5
@Falaque Par opposition à alias x = yin * nix land?
Basic
1
@Falaque alors que pensez-vous que bash fera lors de l'exécution x = y?
phuclv
263

Les espaces sont importants. Vous avez créé une variable nommée 'location ' avec une valeur de
' "bob"'. Remarque - des guillemets simples ont été ajoutés pour montrer l'emplacement de l'espace.

Si vous voulez des guillemets dans votre valeur, alors votre code devrait ressembler à

set location="bob"

Si vous ne voulez pas de guillemets, votre code devrait ressembler à

set location=bob

Ou mieux encore

set "location=bob"

La dernière syntaxe empêche les espaces de fin involontaires d'entrer dans la valeur et protège également contre les caractères spéciaux comme & |etc.

dbenham
la source
8
Y a-t-il des inconvénients pour la dernière syntaxe?
Wolf
8
@Wolf - Non, il n'y a pas d'inconvénient. Cependant, il y a une limite au moment où elle est la plus efficace. Tant que la valeur ne contient pas de guillemets, presque tous les caractères peuvent apparaître dans la valeur sans se soucier de s'échapper. Les exceptions sont %, et éventuellement !si l'expansion retardée est activée. Mais si la valeur ne contient entre guillemets, alors vous devez vous inquiéter quand échapper les caractères de poison comme |, &, etc.
dbenham
1
cela semble être identique à la définition de la variable d'environnement dans Windows. Est-ce le seul moyen d'utiliser des variables locales dans des scripts batch?
parasrish
1
@Wolf, vous n'avez qu'à vous assurer que les extensions de commande sont activées, mais c'est quand même la configuration par défaut ...
aschipfl
7

contribution location.bat

@echo off
cls

set /p "location"="bob"
echo We're working with %location%
pause

production

We're working with bob

(erreurs que vous avez faites: spaceet " ")

Philippe
la source
4
set /pinvite l'utilisateur et stocke la réponse dans la variable spécifiée. par exemple,set /p name="What is your name? " & echo Hello, %name%.
Robert Mooney
6
-1, la syntaxe set /p "varname"="text"est erronée, elle crée une variable nommée location"(avec un guillemet de fin!). Ça devrait l'être set /p location="bob". Mais même alors, cela ne correspond plus à la question
jeb