bat批處理教程之for的/f參數

from:https://www.cnblogs.com/dongzhiquan/archive/2009/08/06/1994754.htmlhtml

for
對不少批處理新手來講多是最很差理解的,而微軟的幫助又極爲苦澀難懂,因此我想把我所瞭解的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 第三個元素htm

    通過調查,下面講到的delims和 tokens 是有默認值的,delims默認值是空格和跳格鍵,tokens 默認值是1(其實原做者後面已經講了,只是可能沒注意),因此產生的集合應該是:
    {第1行第1列,第1行第2列,第1行第3列;
     第2行第1列,第2行第2列,第2行第3列;
     第3行第1列,第3行第2列,第3行第3列} 

     集合中只有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列",
     依次,直到每一個元素都代替完爲止。blog

    一樣緣由執行過程應該爲:token

    用"第1行第1列" 代替%%i,執行do後面的echo %%i,顯示"第1行第1列",
    用"第2行第1列"代替%%i,執行echo %%i,顯示"第2行第1列",
    依次,直到每一個元素都代替完爲止。ip


    爲了增強理解/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列不知道怎麼回事(緣由是tokens 默認值是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列",仍是不知道怎麼回事(緣由是tokens 默認值是1) 。
    
    好了,關於for的/f參數中的file就先說到這,有時間再寫其餘的,若是有什麼疑問,能夠留言交流。
    
    下次是關於for的/f參數中的string。內存

相關文章
相關標籤/搜索