如何取消定义MS-DOS变量?


88

可以说我在CMD shell中执行以下命令:

set FOO=bar

除了回收CMD shell外,还有什么方法可以取消定义此变量?


9
说MS-DOS(已经死了至少10年左右)了吗?还是说MS-DOS但实际上是指Windows命令行(cmd.exe)?
marc_s

4
可能,但是对于这个问题并不重要...
Madara的鬼魂

3
马克的权利。这不是MS-DOS外壳程序。人们从不知道这是一个很大的差异。
Michael-O

@MadaraUchiha,确实,您的set var=答案在MS-DOS 6.22 command.com下的工作原理与Windows cmd.exe下的工作原理相同。(但是,与Windows不同,在var =处用双引号不起作用,而是创建了一个以双引号开头的环境变量。)
Simon Kissane

Answers:


136

是的,您可以使用

set FOO=

或显式使用:

set "FOO="

确保=符号后没有尾随的多余(不可见)字符。那是:

  • set FOO=与有所不同set FOO=      

29

取消设置变量的一种安全方法是也使用引号,那么尾随空格就没有问题。

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%

11

另一种方法

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

注意:这不适用于交互式命令提示符。但是可以在批处理脚本中使用。


9

在我的Windows 7 CMD Shell中,这对我有用:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it

2
set命令中空格很重要。如果尝试set FOO = bar再尝试一次set FOO=,则不会取消设置“ FOO”。但是由于某种原因,它们在内部并不重要% %
泰德·霍普

尾随空间也很重要。抱歉,我认为您的代表说的是270,而不是270k ...糟糕。当代表建议用户不回来时,我经常编辑答案。显然这里不是这样。我的错。
chappjc'2

@chappjs没问题,谢谢编辑!不知道我怎么想的。
Pekka

4

我仅提供以下内容作为评论,但我认为重要的是能够独立存在。

先前的许多答案都提到,需要注意尾随空格;并且可以肯定的是,但是我发现,有时无论什么情况,尾随空格都只想进入该空格-特别是如果您正在执行命令行单线并且需要使用空格作为命令分隔符。

这是解决该问题的方法:

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

通过以这种方式将声明用双引号引起来,可以完全避免间距问题。当通过串联以消除路径之间的空格来创建变量时,这也非常有用,例如,路径:

SET A=c:\users\ && SET D=Daniel
SET P="%a%%d%"
ECHO %P%
:: outputs "C:\Users\ Daniel"
:: Notice the undesirable space there
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.