501 votes

Définir et utiliser une variable dans un fichier batch

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

@echo off

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

Le résultat que j'obtiens est le suivant :

We're working with ""

Qu'est-ce qui se passe ici ? Pourquoi ma variable n'est pas répercutée ?

617voto

Brian Nixon Points 1878

L'espace avant le = est interprété comme faisant partie du nom, et l'espace qui le suit (ainsi que les guillemets) est interprété comme faisant partie de la valeur. La variable que vous avez créée peut donc être référencée à l'aide de la commande %location % . Si ce n'est pas ce que vous voulez, supprimez le ou les espaces supplémentaires dans la définition.

11 votes

Si l'espace avant = est interprétée comme faisant partie du nom, alors la variable ne peut pas être référencée comme %location% il doit être référencé comme %location % . Est-ce une faute de frappe ?

9 votes

@Miserable Variable : Vous avez raison, il semble que la réponse originale ait été victime d'une modification incorrecte.

28 votes

Voici donc ce que MS a proposé

281voto

dbenham Points 46458

Les espaces sont importants. Vous avez créé une variable nommée 'location ' avec une valeur de
' "bob"' . Note - les 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 à ceci

set location="bob"

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

set location=bob

Ou mieux encore

set "location=bob"

La dernière syntaxe permet d'éviter que des espaces de fin de ligne ne se retrouvent par inadvertance dans la valeur, et protège également contre les caractères spéciaux tels que & | etc.

8 votes

Y a-t-il des inconvénients à la dernière syntaxe ?

8 votes

@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 l'échappement. Les exceptions sont % et éventuellement ! si l'expansion retardée est activée. Mais si la valeur contient des guillemets, vous devez alors vous préoccuper du moment où il faut échapper les caractères empoisonnés tels que | , & etc.

1 votes

Cela semble être la même chose que de définir la variable d'environnement dans Windows. Est-ce la seule façon d'utiliser les variables locales dans les scripts batch ?

9voto

Philip Points 305

Entrée location.bat

@echo off
cls

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

sortie

We're working with bob

(erreurs u fait : space y " " )

2voto

npocmaka Points 7794

Pensez également à utiliser SETX - il définira une variable au niveau de l'utilisateur ou de la machine (disponible pour tous les utilisateurs), mais la variable sera utilisable à la prochaine ouverture de cmd.exe, ce qui fait qu'il peut être utilisé conjointement avec SET :

::setting variable for the current user
if not defined My_Var (
  set "My_Var=My_Value"
  setx My_Var My_Value
)

::setting machine defined variable
if not defined Global_Var (
  set "Global_Var=Global_Value"
  SetX Global_Var Global_Value /m
)

Vous pouvez également modifier directement les valeurs du registre :

Variables utilisateur : HKEY_CURRENT_USER \Environment

Variables du système : HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Control\Session Directeur \Environment

Ce qui permettra d'éviter certaines restrictions de SET et SETX comme les variables contenant = dans leurs noms.

Montage par un tiers

SETX.exe Définit les variables d'environnement de façon permanente,

SETX peut être utilisé pour définir les variables d'environnement de la machine (HKLM) ou de l'utilisateur actuellement connecté (HKCU) :

Option /m

 /m
       Set the variable in the system environment HKLM.
       (The default is the local environment HKCU)

Un autre exemple

::setting variable for the current user
if not defined JAVAJDK (
  set "JAVAJDK=C:\Program Files\Java\jdk-13\bin"
  setx JAVAJDK "C:\Program Files\Java\jdk-13\bin"
)

Dans un command.exe vous pouvez utiliser la variable comme ceci cd %JAVAJDK% .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X