批處理FOR命令詳解

對所有的批處理初學者來說,for的應用是最難理解以及掌握的。本文由淺入深,爲大家專門講解for的用法,希望大家喜歡。
首先應該明確的是,for不是一個簡單的命令,它的用法比較複雜,它還可以帶四個參數(/L /D /R /F),其中:/L和/F參數是最經常用到的。當然,它本身也可以不帶參數,下面我們通過具體的例子來講解for的運用。
一、不帶參數的for:
@echo off
for %%i in (1 2 3 4 5) do echo %%i
pause
將以上代碼保存爲批處理文件(如何保存?),然後運行,可以發現屏幕上顯示1 2 3 4 5(每字一行)
是不是明白了一些?它的整個運行機制我們可以這樣看:for不停的從括號中拿出5個“東西”來(以空格做間隔),並將這5個“東西”依次傳給臨時變量%%i,同時把這個變量echo出來....
從這個例子我們可以看出,for的基本用法是:
for 變量 in (目標) do 幹什麼?
變量常用%%i 來表示,當然也可以換成%%j;目標就是待處理的對象集合,比如這裏的1 2 3 4 5;這裏的幹什麼的內容爲:批處理命令。
【相關習題:】將你的名字用for命令分三行顯示出來!!!
二、帶參數 /L 的for (這裏的 參數/L 可以理解爲 "list" 的意思,代表一個數列)
先看測試代碼: 複製內容到剪貼板
代碼:
@echo off
for /l %%i in (1 1 5) do echo %%i
pause
顯示結果也爲:1 2 3 4 5(每字一行)
它的意思和上面的意思差不多,但是括號中的對象卻不需要 寫成 1 2 3 4 5 的形式了,而是:1 1 5,因爲它啓用了參數 /L ,就是告訴for,這個括號裏的對象是個數列,怎樣的數列?就是以 1 開始,步長 爲1 ,結束值爲5的一個等差數列,再舉個實例: 複製內容到剪貼板
代碼:
::顯示 從 10 - 20 的所有偶數:
@echo off
for /l %%i in (10 2 20) do echo %%i
pause
【相關習題:】顯示 1~20 間能被5整 除的整數
三、帶參數 /f 的for(這裏的參數/F可以理解爲“file”的意思,代碼處理對象爲文本串)
參考教程:for 命令 /f 參數 通俗講解
四、for的 /D 和/R 參數(這兩個參數個人比較少用)
1>/D參數(常用來查詢 當前目錄 或者 指定目錄的文件夾)
基本用法:FOR /D %variable IN (set) DO command [command-parameters]
如:查詢F盤根目錄下的文件夾 複製內容到剪貼板
代碼:
@echo off
for /d %%i in (f:\*) do echo %%i
pause>nul
如果省略 括號中的 "f:\",則會直接查詢 批處理 所在目錄的文件夾
假設 本批處理文件 保存在:F:\test下
運行以下批處理代碼,將會查詢 F:\test下的文件夾 複製內容到剪貼板
代碼:
@echo off
for /d %%i in (*) do echo %%i
pause>nul2>

/r參數
基本用法:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 爲根的目錄樹中,所有符合(set)的文件或者文件夾。如果在 /R 後沒有指定目錄,則使用當前
目錄。如果集僅爲一個單點(.)字符,則枚舉該目錄樹。
用法示例:
枚舉F:盤下所有的 文件 複製內容到剪貼板
代碼:
@echo off
for /r f:\ %%i in (*) do echo %%i
pause>nul
枚舉F:盤下所有的 .bat文件(包括子目錄),則: 複製內容到剪貼板
代碼:
@echo off
for /r f:\ %%i in (*.bat) do echo %%i
pause>nul
如果省略以上代碼中的F:\,則會列舉當前目錄 所有符合(set)的文件
如:列舉批處理所在目錄的 所有 批處理文件(包括子目錄) 複製內容到剪貼板
代碼:
@echo off
for /r %%i in (*.bat) do echo %%i
pause>nul

for 命令 /f 參數 通俗講解
for /f 參數最爲複雜,難懂和常用.
在剛學時確實費了我不少腦筋,下面就我個人的理解,給新手們通俗的講講,也好讓新手少走些彎路.
格式:
::例一: 複製內容到剪貼板
代碼:
for /f "skip=1 tokens=1,2* delims= " %%a in (a.txt) do echo %%a %%b %%c
pause
先從引號內的東西講起,很多新手對這些難以理解,因爲 for /? 翻譯的簡直是一塌糊塗.
skip=
tokens=
delims=
這三項是用的最多的,根據需要.可以不用,可以一起使用,也可以只使用一個或兩個.
但是不管使用幾個都要用引號將它們擴起來.當然不使用時,自然就不需要引號了.
skip=
for循環文本內容是以行爲單位,從上至下進行的,skip=1意識就是跳過文本的第一行,即不循環第一行
那麼skip=2 自然就是跳過前兩行了,依次類推.........
delims=
先講這句
delims=後面的字符的意識是,將文本每一行的內容以delims=後面的字符分割成若干列.
假設a.txt某一行的內容是 111,222.333 444/555
我們用下面的語句
::例二: 複製內容到剪貼板
代碼:
for /f "tokens=1-5 delims=,./ " %%a in (a.txt) do echo %%a %%b %%c %%d %%e
pause
顯示結果是 111 222 333 444 555
解釋:
   意識就是把111,222.333 444/555以,./和空格(不分先後)分成了5列.注意代碼中/和"後面有個空格,
   使用中要注意空格要放到最後,如"delims=,. /" 這樣就不行了.
那如果我們不使用逗號來分割會如何呢?如: "delims=./ "那麼就會分割成111,222 333 444 555
看出區別了嗎?delims=後面可以是多個字符,可以是空格,也可以什麼都沒有.
什麼都沒有代表什麼呢?就是不以任何東西爲分割符,也是整行的內容了.
因爲for默認是以,;和空格作分割符的,
所以一般要取得整行內容通常會用"delims="這樣的形式來取消for的默認分割符.
tokens=
tokens=1-5
1-5很好理解就1至5,前面我們用delims=後面的字符爲分割符,將文本內容分成了多列,那麼你需要的是哪些列呢?
用tokens=可以很好幫你提取到.
還是以例二爲例:
通過dilims=,./   將文本分成了111 222 333 444 555 五列.
注意代碼中前面有個%%a 這裏的%%a就是代表第一列,第二列就是%%b,第三列就是%%c 依此類推.....
那麼我們如果把echo %%a %%b %%c %%d %%e 改爲 echo %%e %%d %%c %%b %%a 會如何呢?
當然.會顯示 555 444 333 222 111
如果是:echo %%b %%d 又會顯示什麼呢?   不用我說了吧!
若是第一個%%a把它改爲%%i也是一樣,那麼第二列就是%%j...%%k...依此類推....
明白了?就是按英文字母的順序依此類推的.
這裏我們用的是tokens=1-5但是在例一中,我們用的是tokens=1,2* 有什麼區別呢?
其實差不多-號代表從幾至幾而逗號代表單一的,如 tokens=1,5就是代表第一列和第五列,而不是1至5列.
*號代表剩下的所有的列.如:tokens=1,2*代表%%a爲第一列,%%b爲第二列,%%c代表後面所有的列.
for /f 不但可以循環文本內容還可以循環字符竄,如:
::例三: 複製內容到剪貼板
代碼:
for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
pause
只要將()裏的字符串用引號擴起來,for就會把它當字符串來循環,而不是文本.

這次的for語句系列教程,打算按照for語句的5種句式逐一展開,在講解 for /f 的時候,會穿插講解批處理中一個最爲關鍵、也是新手最容易犯錯的概念:變量延遲,大綱如下: 引用:
一 前言
二 for語句的基本用法
三 for /f (含變量延遲)
四 for /r
五 for /d
六 for /l
一、前言
在批處理中,for是最爲強大的命令語句,它的出現,使得解析文本內容、遍歷文件路徑、數值遞增/遞減等操作成爲可能;配合if、call、goto等 流程控制語句,更是可以實現腳本複雜的自動化、智能化操作;合理使用for語句,還能使代碼大爲簡化,免除各位編寫大量重複語句之苦。而能否熟練使用 for語句,已經成爲衡量一個人批處理水平高低最主要的標準。
二、for語句的基本用法
正如色彩繽紛的七彩光芒是由紅綠藍三原色構成的一樣,最複雜的for語句,也有其基本形態,它的模樣是這樣的:
在cmd窗口中: 複製內容到剪貼板
代碼:
for %I in (command1) do command2在批處理文件中: 複製內容到剪貼板
代碼:
for %%I in (command1) do command2之所以要區分cmd窗口和批處理文件兩種環境,是因爲在這兩種環境下,命令語句表現出來的行爲雖然基本一樣,但是在細節上還是稍有不同,最明顯的一個差 異就是:在cmd窗口中,for之後的形式變量I必須使用單百分號引用,即%I;而在批處理文件中,引用形式變量I必須使用雙百分號,即%%I。爲了方便 起見,若不是特別強調,以下的講解都以批處理文件環境爲例。
我們先來看一下for語句的基本要素都有些什麼: 引用:
  1、for、in和do是for語句的關鍵字,它們三個缺一不可;
2、%%I是for語句中對形式變量的引用,就算它在do後的語句中沒有參與語句的執行,也是必須出現的;
3、in之後,do之前的括號不能省略;
4、command1表示字符串或變量,command2表示字符串、變量或命令語句;現在,你可能已經會寫一個簡單的for語句了,比如:
[example1] 複製內容到剪貼板
代碼:
@echo off
for %%I in (bbs.bathome.cn) do echo %%I
pause
保存爲批處理文件並執行,將會在彈出的批處理窗口中看到這樣的信息: 引用:
bbs.bathome.cn
請按任意鍵繼續...很快地,你會覺得這個for語句是如此的簡單,簡單到你絲毫感受不出它的強大:這個for語句,和我直接用echo語句沒什麼兩樣啊!
是的,演示代碼永遠都只是演示而已,就像大多數高級語言的教科書一樣,在引導新手學習的時候,基本上都是千篇一律地告訴大家如何編寫一個能顯示 hello world! 的窗口,從這些演示代碼中,你看不到它們具有多少實用性,你只是感到有點好奇:咦,居然彈出了一個窗口?片刻之後,你就會覺得索然無味。
那好吧,爲了讓大家對for更加感興趣,我們先來分析一下for語句的一些注意事項,之後,再讓大家看看更爲強大的for語句實例。
引用:
1、 for語句的形式變量I,可以換成26個字母中的任意一個,這些字母會區分大小寫,也就是說,%%I和%%i會被認爲不是同一個變量;形式變量I還可以換 成其他的字符,但是,爲了不與批處理中的%0~%9這10個形式變量發生衝突,請不要隨意把%%I替換爲%%0 ~%%9中的任意一個;
2、in和do之間的command1表示的字符串或變量可以是一個,也可以是多個,每一個字符串或變量,我們稱之爲一個元素,每個元素之間,用空格鍵、跳格鍵、逗號或等號分隔;
3、for語句依次提取command1中的每一個元素,把它的值賦予形式變量I,帶到do後的command2中參與命令的執行;並且每次只提取一 個元素,然後執行一次do後的命令語句,而無論這個元素是否被帶到command2中參與了command2的運行;當執行完一次do後的語句之後,再提 取command1中的下一個元素,再執行一次command2,如此循環,直到command1中的所有元素都已經被提取完畢,該for語句才宣告執行 結束;其中,第3點是最爲關鍵的,它描述了for語句的執行過程,是for語句的精髓所在,大家一定要牢記這一條,才能深刻理解更爲複雜的for流程。
有了以上的基礎,我們再來看一個例子,這個例子修改了example1的部分內容,結果將大不一樣:
[example2] 複製內容到剪貼板
代碼:
@echo off
for %%I in (bbs,bathome,cn) do echo %%I
pause
和example1的執行結果相比,example2發生瞭如下變化:
1、顯示結果分成了3行(不算最後一行中文提示);
2、每一行都從逗號處被切分;
如果把 bbs.bathome.cn 這個字符串中的點號換爲空格、跳格或等號,執行結果將和example2的執行結果別無二致。
現在,我們來分析一下example2代碼中for語句的執行過程:
首先,for語句以逗號爲分隔符,把 bbs,bathome,cn 這個字符串切分成三個元素:bbs、bathome和cn,由此決定了do後的語句將會被執行3次;
然後,第一次執行過程是這樣的:先把 bbs 這個字符串作爲形式變量I的值,帶入do後的語句中加以執行,也就是執行 echo %%I 語句,此時的I值爲bbs,因此,第一次執行的結果,將會在屏幕上顯示bbs這個字符串;第二次執行和第一次執行的過程是一樣的,只不過此時I的值已經被 替換爲command1中的第二個元素了,也就是 bathome 這個字符串;如此循環,當第三次echo執行完畢之後,整條for語句纔算執行完畢,此時,將執行下一條語句,也就是pause命令。
其實,這個例子只比上一個例子多了一點花樣,有趣了那麼一點點:一條for語句的執行結果居然被分成了3行!
爲了讓大家見識一下for的真正威力,本人絞盡腦汁,翻帖無數,不得要領,萬般無奈之下,只好亮出了塵封在箱底多年的一段代碼:檢測當前硬盤都有哪些分區^_^
[example3] 複製內容到剪貼板
代碼:
@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 當前硬盤的分區有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
這段代碼能檢測硬盤都有哪些分區,包括U盤和移動硬盤的分區,但是,當光驅中有盤的時候,也會被列出來,這是本代碼的一個缺憾,在以後的講解中,我將向大家講述如何消除這個瑕疵,敬請關注本系列的後續章節。
練習:用for語句建立test1.txt、test2.txt和test3.txt三個文本文件。
參考: http://bbs.bathome.cn/thread-2189-1-3.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章