bat之for循環

1.沒有任何參數的for

格式爲:for %%i in (set) do command

%%i 爲變量

set爲一個文件或者一組文件,其實就是一個集合。可用通配符,比如*.txt。

command 是要執行的命令。

看個例子:

有個文件夾,有如下文件:
a.txt
b.mp3
c.mp3
c.wma
a.rm
e.bat

你想顯示裏面的擴展名爲mp3的文件,你會用什麼命令呢?當然是dir了,dir *.mp3。

同樣的,for也可以來實現,如下:

for %%i in (*.mp3) do echo %%i

這如何理解?

for會先從括號裏面執行,因爲括號裏面是*.mp3,所以for會先得到當前目錄下所有的擴展名是mp3的文件,並把它們作爲一個集合,而每個文件名就是一個元素,像這樣{b.mp3,c.mp3},然後用%%i依次代替每個元素,之後做do後面的命令。

具體過程如下:

用%%i代替b.mp3,然後執行echo %%i,顯示b.mp3

用%%i代替c.mp3,再執行echo %%i,顯示c.mp3

沒有元素了,for就停止了。

當然,()裏面不侷限於一個文件或者通配符,可以有多個,比如:

for %%i in (*.mp3,*.wma) do echo %%i   也是可以的。

注意:do 後面可以跟任何命令,不要侷限於echo,這裏只是演示。

2. 含有/L的for

格式爲:for /L %%i in (start,step,end) do command

這個表示以增量形式從start到end的一個數字序列,步長是step,就是每次的增量是step

比如:(1,1,5) 將產生序列 1 2 3 4 5,(1,2,9) 將產生1 3 5 7 9序列。

這有什麼用呢?

舉個例子,你想同時打開3個記事本程序,可以這樣:

for /L %%i in (1,1,3) do notpad.exe

如何理解?

還是從括號先執行,產生集合{1,2,3},然後用%%i依次代替集合中的每個元素,之後執行do後面的命令。

當然這裏每次%%i替換集合裏面的元素是沒有意義的,因爲我們並沒有在do後面的命令中用到%%i,但是你不能阻止%%i代替每個元素。

因爲有3個元素,所以do後面的命令執行3次就停止了。

再舉一個例子,加入你要顯示1到20之間的奇數,怎麼辦,可以如下:

for /L %%i in (1,2,20) do echo %%i

同樣是先產生集合{1,3,5,7,9,11,13,15,17,19},然後用%%i依次代替每個元素,之後執行do後面的echo %%i

這個例子就體現出變量%%i會始終代替集合中的每個元素。

3.含有/F的for
格式:
FOR /F ["options"] %%i IN (file) DO command

FOR /F ["options"] %%i IN ("string") DO command

FOR /F ["options"] %%i IN ('command') DO command

這個可能是最常用的,也是最強的命令,主要用來處理文件和一些命令的輸出結果。

file代表一個或多個文件

string 代表字符串

command代表命令

["options"] 可選

對於FOR /F %%i IN (file) DO command

file爲文件名,按照官方的說法是,for會依次將file中的文件打開,並且在進行到下一個文件之前將每個文件讀取到內存,按照每一行分成一個一個的元素,忽略空白的行,看個例子。

假如文件a.txt中有如下內容:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

你想顯示a.txt中的內容,會用什麼命令呢?當然是type,type a.txt

for也可以完成同樣的命令:

for /f %%i in (a.txt) do echo %%i

還是先從括號執行,因爲含有參數/f,所以for會先打開a.txt,然後讀出a.txt裏面的所有內容,把它作爲一個集合,並且以每一行作爲一個元素,所以會產生這樣的集合,

{“第1行第1列 第1行第2列 第1行第3列”, rem 第一個元素

“第2行第1列 第2行第2列 第2行第3列”, rem 第二個元素

“第3行第1列 第3行第2列 第3行第3列”}   rem 第三個元素

集合中只有3個元素,同樣用%%i依次代替每個元素,然後執行do後面的命令。

具體過程:

用%%i代替“第1行第1列 第1行第2列 第1行第3列”,執行do後面的echo %%i,顯示“第1行第1列 第1行第2列 第1行第3列”,

用%%i代替“第2行第1列 第2行第2列 第2行第3列”,執行echo %%i,顯示“第2行第1列 第2行第2列 第2行第3列”,

依次,直到每個元素都代替完爲止。

爲了加強理解/f的作用,請執行一下兩個命令,對比即可明白:

for /f %%i in (a.txt) do echo %%i rem 這個會顯示a.txt裏面的內容,因爲/f的作用,會讀出a.txt中
的內容。

for %%i in (a.txt) do echo %%i rem 而這個只會顯示a.txt這個名字,並不會讀取其中的內容。

通過上面的學習,我們發現for /f會默認以每一行來作爲一個元素,但是如果我們還想把每一行再分解更小的內容,該怎麼辦呢?不用擔心,for命令還爲我們提供了更詳細的參數,使我們將每一行分爲更小的元素成爲可能。

它們就是:delims和tokens

delims 用來告訴for每一行應該拿什麼作爲分隔符,默認的分隔符是空格和tab鍵

比如,還是上面的文件,我們執行下面的命令:

for /f "delims= " %%i in (a.txt) do echo %%i

顯示的結果是:

第1行第1列
第2行第1列
第3行第1列

爲什麼是這樣的呢。因爲這裏有了delims這個參數,=後面有一個空格,意思是再將每個元素以空格分割,默認是隻取分割之後的第一個元素。

執行過程是:

將第一個元素“第1行第1列 第1行第2列 第1行第3列”分成三個元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默認只取第一個,即“第1行第1列”,然後執行do後面的命令,依次類推。

但是這樣還是有侷限的,如果我們想要每一行的第二列元素,那又如何呢?

這時候,tokens跳出來說,我能做到。

它的作用就是當你通過delims將每一行分爲更小的元素時,由它來控制要取哪一個或哪幾個。

還是上面的例子,執行如下命令:

for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i

執行結果:

第1行第2列
第2行第2列
第3行第2列

如果要顯示第三列,那就換成tokens=3。

同時tokens支持通配符*,以及限定範圍。

如果要顯示第二列和第三列,則換成tokens=2,3或tokens=2-3,如果還有更多的則爲:tokens=2-10之類的。

此時的命令爲:

for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

怎麼多出一個%%j?

這是因爲你的tokens後面要取每一行的兩列,用%%i來替換第二列,用%%j來替換第三列。

並且必須是按照英文字母順序排列的,%%j不能換成%%k,因爲i後面是j

執行結果爲:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

對以通配符*,就是把這一行全部或者這一行的剩餘部分當作一個元素了。

比如:

for /f "tokens=* delims= " %%i in (a.txt) do echo %%i

執行結果爲:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其實就跟for /f %%i in (a.txt) do echo %%i的執行結果是一樣的。

再如:

for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

執行結果爲:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩餘的所有

最後還有skip合eol,這倆個簡單,skip就是要忽略文件的前多少行,而eol用來指定當一行以什麼符號開始時,就忽略它。

比如:

for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

結果爲:

第3行第1列 第3行第2列 第3行第3列

用skip來告訴for跳過前兩行。

如果不加tokens=*的話,執行結果爲:

第3行第1列

不知道怎麼回事。

再如,當a.txt內容變成:

.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

執行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i結果是:

第3行第1列 第3行第2列 第3行第3列

用eol來告訴for忽略以“.”開頭的行。

同樣也必須加tokens=*,否則只會顯示“第3行第1列”,還是不知道怎麼回事。

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