批处理脚本:为什么此条件评估为true?
使用以下内容创建一个批处理文件:批处理脚本:为什么此条件评估为true?
@echo off
setlocal
echo %1
if [%1] == [] echo hi
然后在命令提示符下运行它像这样:
script.cmd ==
它将输出如下:
ECHO is off.
hi
为什么这个,它是如何发生的?另外,如何更可靠地检查批处理脚本中的空字符串?
谢谢。
在这种情况下,我建议使用下列内容:
@echo off
setlocal
echo(%~1
if "%~1"=="" echo hi
而不是script.cmd ==
使用script.cmd "=="
请注意,我用echo(
如果变量被认为是空的,这将呼应换行,并我使用了%~1
,它从%1
参数中删除了周围的引号。
您需要周围的引号,因为equal-sign is treated as a delimeter in the arguments除非在引号内,就像空格一样。
有趣!我不知道'echo.'技巧。感谢您的简洁/内容丰富的答案! –
对Dostips进行了大量讨论,如果有一个名为echo的文件是目录,'echo.'可能会产生意想不到的结果。最好使用'echo('。 – SomethingDark
@SomethingDark你正在谈论[this](http://www.dostips.com/forum/viewtopic.php?f=3&t=774&start=0&hilit=echo+blank+line )我想呢?我以前没有读过它,但是在阅读完它之后,我同意使用'echo('确实更好。 –
@ECHO OFF
SETLOCAL
SET "cmdtail=%*"
ECHO(%cmdtail%
IF "%cmdtail%"=="==" ECHO two "="
但是回到未指明的原始问题。
请注意,此语法将检测作为命令尾提供的==
,而%~1
将不计算为==
。
核心问题是'='符号与_space_,_tab_,','和';'一样构成了一个标记分隔符,因此脚本的行为与没有给出的参数一样;把它放在''''之间'废除它们的特殊含义并且保持字面意思;使用'%〜1'访问参数将删除引号...... – aschipfl