Comment annuler la définition d'une variable MS-DOS?

88

Disons que j'exécute ce qui suit dans le shell CMD:

set FOO=bar

Existe-t-il un moyen d'annuler la définition de cette variable, autre que de recycler le shell CMD?

user288004
la source
9
Voulez-vous vraiment dire MS-DOS (qui est mort depuis au moins 10 ans environ) - ou dites-vous MS-DOS mais voulez-vous vraiment dire la ligne de commande Windows ( cmd.exe)?
marc_s
4
Probablement, mais cela n'a pas vraiment d'importance pour cette question ...
Madara's Ghost
3
Marc a raison. Ce n'est pas le shell MS-DOS. Les gens n'apprennent jamais que c'est une grande différence.
Michael-O
@MadaraUchiha, En effet, votre set var=réponse fonctionne sous MS-DOS 6.22 command.com de la même manière que sous Windows cmd.exe. (Cependant, contrairement à Windows, mettre des guillemets doubles autour de var = ne fonctionne pas, mais crée une variable d'environnement dont le nom commence par un guillemet double.)
Simon Kissane

Réponses:

136

Oui, vous pouvez le désactiver avec

set FOO=

Ou en utilisant explicitement:

set "FOO="

Assurez-vous qu'aucun caractère superflu (invisible) de fin ne vient après le =signe. C'est:

  • set FOO=est différent de set FOO=      .
Le fantôme de Madara
la source
29

Un moyen sûr de désactiver la variable est d'utiliser également des guillemets, alors il n'y a pas de problèmes avec les espaces de fin.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
jeb
la source
11

une autre méthode

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Remarque: cela ne fonctionnerait pas sur une invite de commande interactive. Mais fonctionne en script batch.

walid2mi
la source
9

Cela fonctionne pour moi dans mon shell Windows 7 CMD:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
Pekka
la source
2
Les espaces sont importants dans la setcommande. Si vous essayez set FOO = barpuis essayez set FOO=, cela ne désactive pas «FOO». Pour une raison quelconque, cependant, ils ne sont pas (aussi?) Significatifs à l'intérieur % %.
Ted Hopp
L'espace de fuite est également important. Désolé pour la modification, je pensais que votre représentant avait dit 270, pas 270k ... oups. J'édite souvent les réponses lorsque le représentant suggère que l'utilisateur ne revient pas. Ce n'est évidemment pas le cas ici. Mon erreur.
chappjc
@chappjs pas de problème, merci pour l'édition! Je ne sais pas comment j'ai raté ça.
Pekka
4

Je proposerais ce qui suit uniquement à titre de commentaire, mais je pense que c'est suffisamment important pour être autonome.

Beaucoup de réponses précédentes mentionnaient qu'il fallait se méfier des espaces de fin; et c'est sûr que c'est vrai. Cependant, j'ai trouvé que parfois les espaces de fin veulent juste y entrer quoi qu'il arrive - en particulier si vous faites une ligne de commande à une ligne et avez besoin de l'espace comme séparateur de commandes.

Voici la solution à ce problème:

SET FOO=Bar
echo %FOO%
:: outputs Bar
SET "FOO="
echo %FOO%
:: outputs %FOO%

En entourant la déclaration de guillemets doubles de cette façon, le problème d'espacement peut être entièrement évité. Cela peut également être très utile lorsque des variables sont créées par concaténation pour éliminer les espaces entre - par exemple - des chemins, par exemple:

SET A=c:\users\ && SET D=Daniel
SET P="%a%%d%"
ECHO %P%
:: outputs "C:\Users\ Daniel"
:: Notice the undesirable space there
dgo
la source