【发布时间】:2021-02-11 14:51:29
【问题描述】:
如果我运行set 如下:
C:\Users\vagrant>SET UNDEFINED=foo
C:\Users\vagrant>SET UNDEFINED
UNDEFINED=foo
C:\Users\vagrant>SET UNDEFINED
Environment variable UNDEFINED not defined
C:\Users\vagrant>SET UNDEFINED | more
UNDEFINED=foo
C:\Users\vagrant>SET UNDEFINED >nul
C:\Users\vagrant>SET UNDEFINED >nul
Environment variable UNDEFINED not defined
C:\Users\vagrant>SET UNDEFINED | more
Environment variable UNDEFINED not defined
C:\Users\vagrant>SET UNDEFINED >nul | more
Environment variable UNDEFINED not defined
C:\Users\vagrant>SET UNDEFINED >nul| more
C:\Users\vagrant>SET UNDEFINED 2>nul | more
C:\Users\vagrant>SET UNDEFINED 2>nul| more
UNDEFINED=foo
注意,上面的第二条命令是SET UNDEFINED ,后面有两个空格。并且SET UNDEFINED >nul 、SET UNDEFINED >nul | more、SET UNDEFINED 2>nul | more 在| 之前多了一个空格。在这些命令中,set 用另外两个空格解析变量。那么set 是如何解析变量名的。我也找到了cmd parse scripts,但是这里变量名是怎么分词的?
编辑
当空格使用预文件重定向时会出现此问题。换句话说,在字符串后添加空格并重定向。例子:
echo foo>bar.txt
bar.txt 前面的空格以及 foo 附加到文件中。
以下是这方面的示例:
例子:
结果:
【问题讨论】:
-
当您添加额外的空格时,您实际上是在告诉 set 显示一个名为“UNDEFINED”` 或
%UNDEFINED %实际上未定义的变量的值。您可以看到,如果您使用双引号后的空格执行set "UNDEFINED",空格将不再是问题。这与执行set UNDEFINED =foo相同,它不会为%UNDEFINED%bu 返回一个变量,而是为%UNDEFINED %返回一个变量 -
请在Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上阅读我的答案 简单的解决方案是
set "UNDEFINED"以获取输出环境变量列表,其名称以UNDEFINED开头,不区分大小写,独立于后面的空格命令行。 -
@Mofi。谢谢。引用变量是避免问题的好方法。但困扰我的是为什么命令
SET UNDEFINED >nul | more的输出很奇怪。 -
@zhenguoli,正如我在下面的答案中提到的那样。请参阅我对答案所做的编辑。
-
@zhenguoli 我在this answer 中详细解释了在使用
echo或set之类的命令时留给>nul的空格会发生什么,这些命令不会将空格解释为参数分隔符。这可以在仅使用两行set UNDEFINED=foo和set UNDEFINED >nul | more创建批处理文件并从命令提示符窗口中执行此批处理文件时看到。真正执行的第二个命令行是set UNDEFINED 1>nul | more。请注意cmd.exe插入的额外空格。一种解决方案是set "UNDEFINED" >nul | more。
标签: windows batch-file cmd environment-variables