在 Windows XP .CMD 脚本中,使用 SET 将变量设置为空值效果很好。但是,在同一个 CMD 解释器中,直接从命令行使用相同的 SET 命令时,其行为会有所不同:
尝试在 CMD.EXE 命令行中测试它:
C:\>set Q=
C:\>echo %Q%
%Q%
C:\>echo "%Q%"
"%Q%"
C:\>set Q=/Q
C:\>echo %Q%
/Q
C:\>echo "%Q%"
"/Q"
尝试使用如下 .CMD 脚本进行测试:
set Q=
echo %Q%
echo "%Q%"
set Q=/Q
echo %Q%
echo "%Q%"
运行它:
C:\>c.cmd
C:\>set Q=
C:\>echo
ECHO is on.
C:\>echo ""
""
C:\>set Q=/Q
C:\>echo /Q
/Q
C:\>echo "/Q"
"/Q"
我错过了什么?
这是雷德蒙德的一个善意的笑话吗?或者对于这种差异有任何合理的解释吗?
当 .CMD 脚本在命令行中使用时行为不同时,我该如何测试它们?
如何在 CMD 命令行中正确地将变量设置为空字符串值以及如何引用该变量以获取该空字符串?
答案1
我在我的脚本中遇到了完全相同的问题。目前我没有找到将变量设置为空字符串的方法。我只是找到了如何用一个空格初始化它:
set "Var= "
这些引号是可选的。但它们确实有助于明确地看到该空格,并在终端空白清理过程中保留它。
您可以在这里找到更多信息:SET 命令。
答案2
tl;dr - 你遇到的问题是echo %Q%
扩展到echo
。使用echo.%Q%
扩展答案
echo
命令有 4 种行为:
echo on
- 启用回显命令。echo off
- 禁用回显命令。echo
- 显示回显命令选项的状态。echo ...
-...
在屏幕上放置换行符。
如果您将变量传递给 echo 作为参数,并且该变量为空,它将扩展为echo
,并显示类似“ECHO 已关闭”的内容。
许多人使用echo.
命令来显示空字符串(阅读:输出换行符),但并不是每个人都知道echo.
可以用来明确指定您想要的输出行为。例如:
echo.on
- 将输出on
和换行符echo.off
- 将输出off
和换行符echo.
- 将输出换行符echo.something
- 将输出something
和换行符echo.%Q%
%Q%
- 将输出是否为“”/“开”/“关”或其他内容。
.
请记住,和参数之间不应有空格。
看https://technet.microsoft.com/en-us/library/bb490897.aspx?f=255&MSPPError=-2147217396
答案3
虽然你可以检查一个变量是否为空,但如果你想连接变量为支持空/空值的字符串,一个可能的解决方法是字首所有的值都用虚拟字符表示,并且跳过每当您使用此变量时,此字符:
set q=0
set q2=%q:~1%string
测试:
set q=0_
echo %q%
echo %q:~1%concat%q:~1%
set q=0
echo %q%
echo %q:~1%concat%q:~1%
结果将会是_concat_
第一种情况和concat
第二种情况。
答案4
我通常这样做
set v=""
echo v=%v% // <--- v=""
if %v% == ""