2016-04-03 82 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將不計算爲==