2016-04-03 85 views
2

使用以下内容创建一个批处理文件:批处理脚本:为什么此条件评估为true?

@echo off 
setlocal 

echo %1 
if [%1] == [] echo hi 

然后在命令提示符下运行它像这样:

script.cmd == 

它将输出如下:

ECHO is off. 
hi 

为什么这个,它是如何发生的?另外,如何更可靠地检查批处理脚本中的空字符串?

谢谢。

+1

核心问题是'='符号与_space_,_tab_,','和';'一样构成了一个标记分隔符,因此脚本的行为与没有给出的参数一样;把它放在''''之间'废除它们的特殊含义并且保持字面意思;使用'%〜1'访问参数将删除引号...... – aschipfl

回答

2

在这种情况下,我建议使用下列内容:

@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除非在引号内,就像空格一样。

+0

有趣!我不知道'echo.'技巧。感谢您的简洁/内容丰富的答案! –

+2

对Dostips进行了大量讨论,如果有一个名为echo的文件是目录,'echo.'可能会产生意想不到的结果。最好使用'echo('。 – SomethingDark

+0

@SomethingDark你正在谈论[this](http://www.dostips.com/forum/viewtopic.php?f=3&t=774&start=0&hilit=echo+blank+line )我想呢?我以前没有读过它,但是在阅读完它之后,我同意使用'echo('确实更好。 –

1
@ECHO OFF 
SETLOCAL 
SET "cmdtail=%*" 
ECHO(%cmdtail% 
IF "%cmdtail%"=="==" ECHO two "=" 

但是回到未指明的原始问题。

请注意,此语法将检测作为命令尾提供的==,而%~1将不计算为==