简短的回答 - 用方括号:
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.
轰这没有评估为真,也没有评价它为false。脚本DIED。如果你应该关闭反应堆的某个地方,好运气。你现在会像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.
你可以自己测试,它适用于上述情况确定。这是合乎逻辑的 - 引号与括号无关,所以这里没有魔法。但是用括号来激发参数呢?
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.
但我得到的,什么时候"
-characters数 “匹配”(即 - 为偶数),在这种情况下:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - 我希望你学到了一些关于.bat
文件如何拆分它们的命令行参数的东西(提示:*它不完全像bash中那样)。上面的参数包含一个空格。但报价不会自动剥离。
和argq?它对此有何反应?可以预见的是:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
所以 - 想你之前说:“?知道什么就用引号[因为,对我来说,这看起来更好]”。
编辑
近日,有关于这个答案的评论 - 好,sqare括号“无法处理”引用传递参数和对待他们就像如果他们没有报价。
语法:
if "%~1"=="" (...)
是不是有些新发现凭借双引号的,但是从参数变量剥离报价的实用的功能的显示,如果第一个和最后一个字符是一个双引号。
这种“技术”的作品一样好与方括号:
if [%~1]==[] (...)
正是指出这一点有益的事情,所以我也给予好评的新的答案。
最后,双引号的粉丝,你的书中是否存在形式为""
的参数,还是空白?只是要求;)
如果在其他两个IF语句中添加括号(如在'GOTO BLANK`行中),是否解决了这个问题? – 2011-02-10 04:00:05