如何删除cmd变量?

101

假设我在CMD shell中执行以下命令:

SET "FOO=bar"

除了重新启动CMD shell,还有没有其他方法可以取消定义这个变量呢?


11
你是否真的指的是早在至少10年前就已经停用的MS-DOS操作系统,还是你说“MS-DOS”实际上指的是Windows命令行(cmd.exe)? - marc_s
5
很可能是这样,但对于这个问题来说并不重要。 - Madara's Ghost
4
马克说得对。这不是MS-DOS的命令行界面。人们从来没有意识到这是一个很大的区别。 - Michael-O
@MadaraUchiha,确实,您的set var=答案在MS-DOS 6.22 command.com下与Windows cmd.exe下的效果相同。(但是,与Windows不同的是,在var=周围放置双引号无效,而是创建一个以双引号开头的环境变量名称。) - Simon Kissane
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
154

是的,你可以使用以下代码取消设置:

set FOO=

或者明确地使用:

set "FOO="

确保在等号=符号后面没有任何多余的(不可见)字符。即:

  • set FOO=set FOO=      是不同的。

对我来说,只有这样才有效:$Env:FOO = "" - BugsForBreakfast
2
@BugsForBreakfast 这是在PowerShell中正确的命令,set FOO 是针对 cmd 的。 - acl

33

安全地取消变量的方法是同时使用引号,这样就不会出现尾随空格的问题。

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

14

另一种方法

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

注意:此方法无法在交互式命令提示符上运行,但可以在批处理脚本中运行。


10
这对我来说在我的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”。但出于某种原因,在“% %”内部它们不是(那么)重要。 - Ted Hopp
尾随空格也很重要。抱歉修改了,我以为你的声望是270而不是270k...糟糕。当声望表明用户不会回来时,我经常编辑答案。显然这里不是这种情况。我的错误。 - chappjc
@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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,