rem和::都起到註釋的作用,然而又有些不同。
一、
rem是一條命令,在運行的時候相當於把rem本身及其後面的內容置空。既然它是一條命令,就必須處於單獨的一行或者有類似“&”的連接符號連接。
二、
批處理遇到以冒號“:”開頭的行時(忽略冒號前的空格),會將其後的語句識別爲“標記”而不是命令語句,因此類似“:label”這樣的東東在批處理中僅僅是一個標記。
三、
對於“::”而言,之所以可以達到註釋的效果,是因爲第二個:不是標籤的合法字符(把它換成/;.等等都行),它不被當作一個合法的標籤
這一點很好理解,如果在你的批處理中有一個永遠用不到的標籤hero,那麼你就可以用“:hero”打頭來作爲註釋。只不過冒號有其先天的優越性--語法上的問題。
好了,我們現在回過頭來看看call。比如“call:hero”,爲什麼要有冒號?這是爲了與文件hero區分。
四、
嗯,我想你已經明白我的意思了,下面我將爲你解釋一些奇妙的東西。
經驗告訴我們,在複合語句中使用“:”經常會出問題。那麼究竟什麼時候會出現問題?
例1、
代碼:
@echo off
for %%i in (a b c) do (
:來瓶啤酒
echo hero!
echo %%i
)
pause
這個運行沒問題。
例2、
代碼:
@echo off
for %%i in (a b c) do (
echo hero!
:來瓶啤酒
echo %%i
)
pause
這個運行也沒問題。
例3、
代碼:
@echo off
for %%i in (a b c) do (
echo hero!
echo %%i
:來瓶啤酒
)
pause
這個就有問題了。
例4、
代碼:
@echo off
if a==a (
echo super!
echo hero!
:來瓶啤酒
)
pause
這個也有問題。
例3和例4都提示--“此時不應該有)”。我們用眼看就能得到一個結論--標籤所在行的下一行不能是後括號“)”。不過很遺憾,看例5
例5、
代碼:
@echo off
echo super!
echo hero!
:來瓶啤酒
)
pause
運行沒問題,看來問題還出在複合語句上而不僅僅是後括號“)”上。
如果這不是批處理的一個bug的話,那麼請允許我大膽的猜測一下。回顧一下例4,“:來瓶啤酒”是複合語句塊的最後一句,此後該語句塊中就沒有語句了,如果此時有一個goto語句跳轉過來,那麼系統將無法識別下一句究竟是哪個而導致混亂,爲避免這種情況的發生,系統就設定了這麼一個錯誤。
至於“::”的情況,其實也是一個道理,系統只知道它是一個標籤而不進行處理,其它的“難題”都交給goto。