简短的答案-使用方括号:
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.
繁荣这没有评估为true,也没有评估为false。脚本已死。如果您应该关闭反应堆的某个地方,那么,祝您好运。您现在将像哈里·达格利安(Harry Daghlian)一样死去。
您可能会想-好吧,参数不能包含引号。如果他们这样做,则会发生这种情况。错误这里有些安慰:
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.
您可以测试自己,在上述情况下可以正常工作。这是合乎逻辑的-引号与方括号无关,因此这里没有魔术。但是,用方括号来修饰args呢?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
那里没有运气。括号不能cho住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]==[] (...)
指出这一点很有用,所以我也赞成新的答案。
最后,双引号迷,""
您的书中是否存在表格形式的参数,还是空白?就像阿斯金';)
GOTO BLANK
在其他两个IF
语句中添加方括号(如该行所示),是否可以解决问题?