2010年11月4日 星期四

BAT大補帖 - for(04)

接下來要介紹的是For的這一個指令。

FOR的這一個指令功能之多,有一些非迴圈的功能都隱藏在FOR這一個指令裡面。

列印1,3,5,7,9

@ECHO OFF
FOR /L %%P IN (1,2,10) DO (
echo %%P
)
PAUSE

這裡要注意,如果要在批次程式中使用FOR命令,請指定%%p,而不要指定%%P。 變數名稱有大小寫的區分,所以%%p不同於%%P

若有一個檔案,myfile.txt,內容如下
; This is sample code start
a1,a2,a3,a4,a5,a6
b1,b2,b3,b4,b5,b6
c1,c2,c3,c4,c5,c6
d1,d2,d3,d4,d5,d6
; This is sample code end

file.bat
@ECHO OFF
FOR /F "eol=; tokens=2,3* delims=, " %%i in (myfile.txt) do (
echo first: %%i
echo second: %%j
echo other: %%k
)

eol表示當我是由;開頭的行,我就不去分析它。
因為,FOR這一個指令在讀取檔案,並且去分析的時候,是以一行為單位。
由第一行開始讀取時,發現是由;開頭的,程式就會直接忽略第一行
; This is sample code start
繼續分析下一行。

FOR的檔案分析,其實就是把每一行的內容分成許多欄位,而delims就是設定由哪一些符號當作分格符號。例如這一個例子中,我們是以,空白字元當作分格符號。因此,第二行就會被分割成以下欄位。
第一欄: a1
第二欄: a2
第三欄: a3
第四欄: a4
第五欄: a5
第六欄: a6

而我們把這一行分成這麼多欄位,我們不一定會每一個欄位都拿來使用。而tokens就是表示說,我只要拿哪一些欄位。
若我只設定tokens=2-4
那這一個意思是說,我只會拿出欄位2欄位4來做處理。

那拿出來的數值,會被存放在哪一個檔數中呢?
這就取決於我們設定於後面的%%i
所以,我們選用的第一的欄位會被放在%%i,而選用的第二個欄位會被放在%%j
所以,在我們file.bat的這一個例子中,在分析第二行(非註解的第一行)時,%%i裡面的內容就會是a2,而%%j的內容就會是a3

相信你應該有注意到(指)
那tokens=2,3後面接的*是什麼意思呢?
而我只有選用兩個欄位而已(2與3),怎麼%%k裡面會有內容哩?

沒有錯,若你在tokens最後面有加*的話,那麼在這一行沒有被選用的剩於的部分,會被存放在你還沒有使用的下一個變數中,這一個例子中,%%i存放a2%%j存放a3,所以,%%k就會存放a4,a5,a6

我們可以對檔案內容分析之外,我們也可以對變數做分析
例如:我們對PATH這一個變數做分析~
我們把PATH裡面第一個欄位與第三個欄位印出來
variable.bat
@ECHO OFF
ECHO Original: %PATH%
FOR /F "tokens=1,3 delims=;" %%I IN ("%PATH%") DO (
ECHO first: %%I
ECHO third: %%J
)
PAUSE


另外,也可以分析執行完指令後的結果~
result.bat
@ECHO OFF
type myfile.txt
ECHO.
ECHO.
FOR /F "eol=; tokens=2,3* delims=," %%i IN ('type myfile.txt') DO (
echo first: %%i
echo second: %%j
echo other: %%k
)
PAUSE

這裡用到一個新的指令,type,這一個指令會把後面接的檔案的內容顯示在終端機上~

另外,要善用說明檔~
help印出目前系統可以使用的指令
FOR /?
TYPE /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
FOR
TYPE

6 則留言:

小中 提到...

file.bat這個程式看不太懂ㄝ

冰燕 提到...

因為我還沒有寫完啊~~

小中 提到...

result.bat的用意是什麼?是把type印出原本的內容,然後用for印出擷取的內容,然後從螢幕比較嗎?

小中 提到...

variable.bat裡的%PATH%為什麼要用""括起來才可以?

冰燕 提到...

'type myfile.txt'沒有什麼比較的意義,它只是表示,我可以分析指令的結果。

你可以試著把'type myfile.txt'改成'echo %time%'。當然,這樣,你FOR裡面的分隔符號就要改寫

Just an example!

冰燕 提到...

variable.bat裡的%PATH%為什麼要用""括起來才可以?

答:因為,我們分析的是字串。請參照for /?

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]