简短回答 - 使用方括号:
if [%1]==[] goto :blank
或者(当需要处理带引号的参数时,请参见下面的编辑):
if [%~1]==[] goto :blank
为什么?你可能会问。嗯,就像Jeremiah Willcock提到的那样:http://ss64.com/nt/if.html - 他们使用这个!好的,但引号有什么问题吗?
简单回答:它们是“神奇”的 - 有时双引号会转换为单引号。而且它们需要匹配,首先。
考虑一下这个小脚本:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
让我们来测试一下:
C:\> argq bla bla
bla
bla
Done.
看起来能工作。但是现在,让我们切换到第二档:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom 这不是真,也不是假。脚本已崩溃。如果你本应该关闭反应堆,那就太倒霉了。现在你会像哈里·达格利安一样死去。
你可能会认为 - 好吧,参数不能包含引号。如果它们包含,就会发生这种情况。错了 这里有一些安慰:
C:\> argq ""bla bla""
""bla
bla""
Done.
哦,是的。别担心 - 有时候 这个 会 生效。
让我们尝试另一个脚本:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
你可以自行测试,对于上述情况它可以正常工作。这是符合逻辑的 - 引号与括号无关,因此这里没有什么魔法。但是如果用括号来增加参数呢?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
运气不好。括号无法阻止cmd.exe
的解析器。
让我们回到邪恶引号的问题上。当参数以引号结尾时,问题就出现了:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
如果我只通过了这些呢:
D:\>argq bla2"
The syntax of the command is incorrect.
脚本根本无法运行。对于
args.bat
也是同样的情况:
D:\>args bla2"
The syntax of the command is incorrect.
但是如果在这种情况下 "
字符的数量“匹配”(即为偶数),我会得到什么:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - 希望您了解了关于.bat
文件如何拆分其命令行参数的一些知识(提示:它与bash并不完全相同)。上述参数包含一个空格。但是引号不会被自动剥离。
那么argq呢? 它会有怎样的反应? 预料之中:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
所以,在你说:“你知道吗?只需使用引号(因为在我看来,这样更好看)”之前请先考虑。
编辑
最近有评论指出了这个答案 - 方括号“无法处理”传递带引号的参数,并将它们处理成未加引号的参数。
语法:
if "%~1"=="" (...)
这并不是双引号的新发现,而是展示了一个很好的特性,可以从参数变量中去除引号,如果第一个和最后一个字符是双引号。
这种“技术”同样适用于方括号:
if [%~1]==[] (...)
指出这一点非常有用,所以我也支持新答案。
最后,喜欢双引号的朋友们,你们的书中是否存在像""
这样的参数,或者是空白的?只是问一下;)
IF
语句中加上括号(就像在GOTO BLANK
行中一样),那么问题会得到解决吗? - Jeremiah Willcock