bat命令中rem和:: 的區別
rem和::都起到注釋的作用,然而又有些不同。
一、
rem是一條命令,在運行的時候相當於把rem本身及其后面的內容置空。既然它是一條命令,就必須處於單獨的一行或者有
類似“&”的連接符號連接。
二、
批處理遇到以冒號“:”開頭的行時(忽略冒號前的空格),會將其后的語句識別為“標記”而不是命令語句,因此類似
“:label”這樣的東東在批處理中僅僅是一個標記。
三、
對於“::”而言,之所以可以達到注釋的效果,是因為第二個:不是標簽的合法字符(把它換成\;.等等都行),它不被當
作一個合法的標簽
這一點很好理解,如果在你的批處理中有一個永遠用不到的標簽hero,那么你就可以用“:hero”打頭來作為注釋。只不過
冒號有其先天的優越性--語法上的問題。
好了,我們現在回過頭來看看call。比如“call:hero”,為什么要有冒號?這是為了與文件hero區分。
四、
嗯,我想你已經明白我的意思了,下面我將為你解釋一些奇妙的東西。
經驗告訴我們,在復合語句中使用“:”經常會出問題。那么究竟什么時候會出現問題?
例1、
復制內容到剪貼板
代碼:
@echo off
@ %%i
for %%i in (a b c) do (
:來瓶啤酒
echo hero!
echo %%i
)
pause
這個運行沒問題。
注:%%i 是for命令中獨有的變量參數,由for命令進行解釋,而且僅在for循環中有效。
例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。
參考鏈接:
