bat命令中rem和:: 的區別

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。

 

zz:http://bbs.verybat.org/thread-9863-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章