簡短的回答 - 用方括號:
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