bat命令中 rem 和 :: 的區別


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。

參考鏈接:

http://wenku.baidu.com/link?url=ye_GOP8HI59VUGstx78teKraOBMukc706K0YV6C_dNvxRUjMzSNf-GmrLFa_OD2OsYGuY7LWoz9__Kn-rz2XK6R05Xn4MTFm_kd-1DbjBJy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM