for語句從入門到精通
對所有的批處理初學者來說,for的應用是最難理解以及掌握的。本文由淺入深,為大家專門講解for的用法,希望大家喜歡。
首先應該明確的是,for不是一個簡單的命令,它的用法比較復雜,它還可以帶四個參數(/L /D /R /F),其中:/L和/F參數是最經常用到的。當然,它本身也可以不帶參數,下面我們通過具體的例子來講解for的運用。
一、不帶參數的for:
將以上代碼保存為批處理文件(如何保存?),然后運行,可以發現屏幕上顯示1 2 3 4 5(每字一行)首先應該明確的是,for不是一個簡單的命令,它的用法比較復雜,它還可以帶四個參數(/L /D /R /F),其中:/L和/F參數是最經常用到的。當然,它本身也可以不帶參數,下面我們通過具體的例子來講解for的運用。
一、不帶參數的for:
@echo off
for %%i in (1 2 3 4 5) do echo %%i
pause
是不是明白了一些?它的整個運行機制我們可以這樣看:for不停的從括號中拿出5個“東西”來(以空格做間隔),并將這5個“東西”依次傳給臨時變量%%i,同時把這個變量echo出來....
從這個例子我們可以看出,for的基本用法是:
for 變量 in (目標) do 干什么?
變量常用%%i 來表示,當然也可以換成%%j;目標就是待處理的對象集合,比如這里的1 2 3 4 5;這里的干什么的內容為:批處理命令。
【相關習題:】將你的名字用for命令分三行顯示出來!!!
二、帶參數 /L 的for (這里的 參數/L 可以理解為 "list" 的意思,代表一個數列)
先看測試代碼:
復制內容到剪貼板
顯示結果也為:1 2 3 4 5(每字一行)代碼:
@echo off
for /l %%i in (1 1 5) do echo %%i
pause
它的意思和上面的意思差不多,但是括號中的對象卻不需要 寫成 1 2 3 4 5 的形式了,而是:1 1 5,因為它啟用了參數 /L ,就是告訴for,這個括號里的對象是個數列,怎樣的數列?就是以 1 開始,步長 為1 ,結束值為5的一個等差數列,再舉個實例:
復制內容到剪貼板
【相關習題:】顯示 1~20 間能被5整 除的整數代碼:
::顯示 從 10 - 20 的所有偶數:
@echo off
for /l %%i in (10 2 20) do echo %%i
pause
三、帶參數 /f 的for(這里的參數/F可以理解為“file”的意思,代碼處理對象為文本串)
參考教程:for 命令 /f 參數 通俗講解
四、for的 /D 和/R 參數(這兩個參數個人比較少用)
1>/D參數(常用來查詢 當前目錄 或者 指定目錄的文件夾)
基本用法:FOR /D %variable IN (set) DO command [command-parameters]
如:查詢F盤根目錄下的文件夾
復制內容到剪貼板
如果省略 括號中的 "f:\",則會直接查詢 批處理 所在目錄的文件夾代碼:
@echo off
for /d %%i in (f:\*) do echo %%i
pause>nul
假設 本批處理文件 保存在:F:\test下
運行以下批處理代碼,將會查詢 F:\test下的文件夾
復制內容到剪貼板
2> /r參數代碼:
@echo off
for /d %%i in (*) do echo %%i
pause>nul
基本用法:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹中,所有符合(set)的文件或者文件夾。如果在 /R 后沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
用法示例:
枚舉F:盤下所有的 文件
復制內容到剪貼板
枚舉F:盤下所有的 .bat文件(包括子目錄),則:
代碼:
@echo off
for /r f:\ %%i in (*) do echo %%i
pause>nul
復制內容到剪貼板
如果省略以上代碼中的F:\,則會列舉當前目錄 所有符合(set)的文件代碼:
@echo off
for /r f:\ %%i in (*.bat) do echo %%i
pause>nul
如:列舉批處理所在目錄的 所有 批處理文件(包括子目錄)
復制內容到剪貼板
代碼:
@echo off
for /r %%i in (*.bat) do echo %%i
pause>nul
for 命令 /f 參數 通俗講解
for /f 參數最為復雜,難懂和常用.在剛學時確實費了我不少腦筋,下面就我個人的理解,給新手們通俗的講講,也好讓新手少走些彎路.
格式:
::例一:
復制內容到剪貼板
先從引號內的東西講起,很多新手對這些難以理解,因為 for /? 翻譯的簡直是一塌糊涂.代碼:
for /f "skip=1 tokens=1,2* delims= " %%a in (a.txt) do echo %%a %%b %%c
pause
skip=
tokens=
delims=
這三項是用的最多的,根據需要.可以不用,可以一起使用,也可以只使用一個或兩個.
但是不管使用幾個都要用引號將它們擴起來.當然不使用時,自然就不需要引號了.
skip=
for循環文本內容是以行為單位,從上至下進行的,skip=1意識就是跳過文本的第一行,即不循環第一行
那么skip=2 自然就是跳過前兩行了,依次類推.........
delims=
先講這句
delims=后面的字符的意識是,將文本每一行的內容以delims=后面的字符分割成若干列.
假設a.txt某一行的內容是 111,222.333 444/555
我們用下面的語句
::例二:
復制內容到剪貼板
顯示結果是 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以,./和空格(不分先后)分成了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就會把它當字符串來循環,而不是文本.代碼:
for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
pause
==============
==============
批處理是一門簡單的腳本語言,雖然不能獨當一面,但是,若作為工作中的輔助工具,絕對會讓大家有隨用隨寫、稱心如意的暢快感。
和其他語言相比,批處理語言有其先天性的優勢:
1、系統自帶,無需另行安裝;
2、命令少,語句簡潔,上手非常快;
3、編寫出來的腳本小巧玲瓏,隨寫隨用;
但是,因為它以命令行方式工作,操作多有不便,在圖形界面大行其道的windows世界里,多多少少會讓大眾望而卻步;就算是對命令行有好感的新手,面對微軟有如天書的幫助文件,很多人也會敗下陣來,因此,論壇里很多會員也發出了編寫系統的批處理教程的呼聲。
編寫系統的批處理新手教程,一直是論壇管理層討論的熱點問題,但是,各位管理人員大多都有工作在身,而系統的教程涉及的面是如此之廣,面對如此浩大的工程,僅憑一兩個人的力量,是難以做好的,因此,本人退而求其次,此次發布的教程,以專題的形式編寫,日后人手漸多之后,再考慮組織人力編寫全面的教程。
之所以選擇最難的for,一是覺得for最為強大,是大多數人最希望掌握的;二是若寫其他命令教程,如果沒有for的基礎,展開來講解會無從下手;三是for也是批處理中最復雜最難掌握的語句,把它攻克了,批處理的學習將會一片坦途。
這次的for語句系列教程,打算按照for語句的5種句式逐一展開,在講解 for /f 的時候,會穿插講解批處理中一個最為關鍵、也是新手最容易犯錯的概念:變量延遲,大綱如下:
引用:
一 前言
二 for語句的基本用法
三 for /f (含變量延遲)
四 for /r
五 for /d
六 for /l
一、前言
在批處理中,for是最為強大的命令語句,它的出現,使得解析文本內容、遍歷文件路徑、數值遞增/遞減等操作成為可能;配合if、call、goto等流程控制語句,更是可以實現腳本復雜的自動化、智能化操作;合理使用for語句,還能使代碼大為簡化,免除各位編寫大量重復語句之苦。而能否熟練使用for語句,已經成為衡量一個人批處理水平高低最主要的標準。
在這個系列教程中,我將通過實際應用中頻繁出現的例子,帶領大家步入for語句的神奇之門,一步步邁向for語句的魔幻殿堂,使得大家在實際的應用中,能獨立寫出簡潔高效的代碼,在批處理的世界里自由馳騁。
注意:以下的講解,都是基于簡體中文版Windows XP Pro SP3的操作系統環境。
在這個系列教程中,我將通過實際應用中頻繁出現的例子,帶領大家步入for語句的神奇之門,一步步邁向for語句的魔幻殿堂,使得大家在實際的應用中,能獨立寫出簡潔高效的代碼,在批處理的世界里自由馳騁。
注意:以下的講解,都是基于簡體中文版Windows XP Pro SP3的操作系統環境。
二、for語句的基本用法[2008.11.9更新]
正如色彩繽紛的七彩光芒是由紅綠藍三原色構成的一樣,最復雜的for語句,也有其基本形態,它的模樣是這樣的:
在cmd窗口中:
我們先來看一下for語句的基本要素都有些什么:
現在,你可能已經會寫一個簡單的for語句了,比如:
[code1]
[result1]
很快地,你會覺得這個for語句是如此的簡單,簡單到你絲毫感受不出它的強大:這個for語句,和我直接用echo語句沒什么兩樣啊!
是的,演示代碼永遠都只是演示而已,就像大多數高級語言的教科書一樣,在引導新手學習的時候,基本上都是千篇一律地告訴大家如何編寫一個能顯示 hello world! 的窗口,從這些演示代碼中,你看不到它們具有多少實用性,你只是感到有點好奇:咦,居然彈出了一個窗口?片刻之后,你就會覺得索然無味。
那好吧,為了讓大家對for更加感興趣,我們先來分析一下for語句的一些注意事項,之后,再讓大家看看更為強大的for語句實例。
其中,第3點是最為關鍵的,它描述了for語句的執行過程,是for語句的精髓所在,大家一定要牢記這一條,才能深刻理解更為復雜的for流程。
有了以上的基礎,我們再來看一個例子,這個例子修改了[code1]的部分內容,結果將大不一樣:
[code2]
1、顯示結果分成了3行(不算最后一行中文提示);
2、每一行都從逗號處被切分;
如果把 bbs.bathome.cn 這個字符串中的點號換為空格、跳格或等號,執行結果將和example2的執行結果別無二致。
現在,我們來分析一下[code2]代碼中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的真正威力,本人絞盡腦汁,翻帖無數,不得要領,萬般無奈之下,只好亮出了塵封在箱底多年的一段代碼:檢測當前硬盤都有哪些分區^_^
[code3]
高級應用:
想知道當前目錄下都有哪些文件嗎?請用下面的代碼:
1、列出當前目錄下各種文件的方法,最簡單的還是用dir命令,但是,從以上代碼中,各位可以加深對for語句執行流程的理解(用到了通配符*和?);
2、注意:以上代碼不能列出含有隱藏或系統屬性的文件;
練習:用for語句建立test1.txt、test2.txt和test3.txt三個文本文件。
更全面的練習請看這個帖子:for語句從入門到精通配套練習題
在cmd窗口中:
復制內容到剪貼板
在批處理文件中:
代碼:
for %I in (command1) do command2
復制內容到剪貼板
之所以要區分cmd窗口和批處理文件兩種環境,是因為在這兩種環境下,命令語句表現出來的行為雖然基本一樣,但是在細節上還是稍有不同,最明顯的一個差異就是:在cmd窗口中,for之后的形式變量I必須使用單百分號引用,即%I;而在批處理文件中,引用形式變量I必須使用雙百分號,即%%I。為了方便起見,若不是特別強調,以下的講解都以批處理文件環境為例。代碼:
for %%I in (command1) do command2
我們先來看一下for語句的基本要素都有些什么:
引用:
1、for、in和do是for語句的關鍵字,它們三個缺一不可;
2、%%I是for語句中對形式變量的引用,就算它在do后的語句中沒有參與語句的執行,也是必須出現的;
3、in之后,do之前的括號不能省略;
4、command1表示字符串或變量,command2表示字符串、變量或命令語句;
[code1]
復制內容到剪貼板
保存為批處理文件并執行,將會在彈出的批處理窗口中看到這樣的信息:代碼:
@echo off
for %%I in (bbs.bathome.cn) do echo %%I
pause
[result1]
引用:
bbs.bathome.cn
請按任意鍵繼續...
是的,演示代碼永遠都只是演示而已,就像大多數高級語言的教科書一樣,在引導新手學習的時候,基本上都是千篇一律地告訴大家如何編寫一個能顯示 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語句才宣告執行結束;
有了以上的基礎,我們再來看一個例子,這個例子修改了[code1]的部分內容,結果將大不一樣:
[code2]
復制內容到剪貼板
和[code1]的執行結果[result1]相比,[result2]發生了如下變化:代碼:
@echo off
for %%I in (bbs,bathome,cn) do echo %%I
pause
1、顯示結果分成了3行(不算最后一行中文提示);
2、每一行都從逗號處被切分;
如果把 bbs.bathome.cn 這個字符串中的點號換為空格、跳格或等號,執行結果將和example2的執行結果別無二致。
現在,我們來分析一下[code2]代碼中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的真正威力,本人絞盡腦汁,翻帖無數,不得要領,萬般無奈之下,只好亮出了塵封在箱底多年的一段代碼:檢測當前硬盤都有哪些分區^_^
[code3]
復制內容到剪貼板
這段代碼能檢測硬盤都有哪些分區,包括U盤和移動硬盤的分區,但是,當光驅中有盤的時候,也會被列出來,這是本代碼的一個缺憾,在以后的講解中,我將向大家講述如何消除這個瑕疵,敬請關注本系列的后續章節。代碼:
@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
高級應用:
想知道當前目錄下都有哪些文件嗎?請用下面的代碼:
復制內容到剪貼板
想列出當前目錄下所有的文本文件嗎?請用下面的代碼:
代碼:
@echo off
for %%i in (*.*) do echo "%%i"
pause
復制內容到剪貼板
想列出只用兩個字符作為文件名的文本文件嗎?請用下面的代碼:
代碼:
@echo off
for %%i in (*.txt) do echo "%%i"
pause
復制內容到剪貼板
題外話:代碼:
@echo off
for %%i in (??.txt) do echo "%%i"
pause
1、列出當前目錄下各種文件的方法,最簡單的還是用dir命令,但是,從以上代碼中,各位可以加深對for語句執行流程的理解(用到了通配符*和?);
2、注意:以上代碼不能列出含有隱藏或系統屬性的文件;
練習:用for語句建立test1.txt、test2.txt和test3.txt三個文本文件。
更全面的練習請看這個帖子:for語句從入門到精通配套練習題
三、文本解析顯神威:for /f 用法詳解[2008.11.9發表]
前言
for /f 是個十分強大的家伙。
如果說,for語句是批處理中最強大的語句的話,那么,for /f 就是精華中的精華。
for /f 的強大,和它擁有眾多的開關密切相關。因為開關眾多,所以用法復雜,本章將分成若干小節,為大家逐一介紹強大的 for /f 語句。
(一) 為解析文本而生:for /f 的基本用法
所有的對象,無論是文件、窗體、還是控件,在所有的非機器語言看來,無外乎都是形如"c:\test.txt"、"CWnd"之類的文本信息;而所有的對象,具體的如ini文件中的某條配置信息、注冊表中的某個鍵值、數據庫中的某條記錄……都只有轉化為具有一定格式的文本信息,方可被代碼識別、操控。可以說,編程的很大一部分工作,都是在絞盡腦汁想方設法如何提取這些文本信息。
而提取文本信息,則是for /f的拿手好戲:讀取文件內容;提取某幾行字符;截取某個字符片段;對提取到的內容再切分、打亂、雜糅……只要你所能想到的花樣,for /f 都會想方設法幫你辦到,因為,for /f 就是被設計成專門用于解析文本的。
先來看個例子。
假如有個文本文件test.txt,內容如下:
[txt1]
那么,將如下代碼保存為test.cmd,并放在test.txt同一目錄下運行,將會在屏幕上原樣顯示test.txt的內容:
[code4]
進階話題:for /f 語句是把整個test.txt一次性顯示出來的?
在這段代碼中,雖然執行結果是把test.txt中的所有內容都顯示出來了,貌似 for /f 語句是把整個test.txt一次性顯示到屏幕上,實際上并非如此。
無論for語句做何種變化,它的執行過程仍然遵循基本的for流程:依次處理每個元素,直到所有的元素都被處理為止。只不過在for /f語句中,這里的元素是指文件中的每一行,也就是說,for /f 語句是以行為單位處理文本文件的。這是一條極為重要的規則,在上一章中也強調過它的重要性,希望在接下來的學習過程中,你能時刻牢記這一原則,那么,很多問題將會迎刃而解。以下是驗證這一說法的演示代碼(在[code4]的基礎上添加了&pause語句):
[code5]
也許你對[code4]這段代碼不屑一顧:不就是把test.txt的內容顯示出來了么?好像用處不大啊。
好吧,我們來玩個魔術。
還是[txt1]這段文本,把[code4]改造一下:
[code6]
[result2]
試想一下,這段代碼會有什么用呢?
如果別人給了你一個軟件清單,每行都是"英文軟件名(逗號)中文軟件名"的格式,而你卻只想保留英文名的時候,這段代碼將是多么有用啊!再假設,有這么一個IP文件,第一列是數字格式的IP地址,第二列是具體的空間地址,列與列之間用逗號分隔,而你想提取其中數字格式的IP,呵呵,我不說你也知道該怎么辦了吧?
要是文本內容不是以逗號分隔,而是以其他符號分隔,那么,把"delims=,"的逗號換成相應的符號就可以了。
在這里,我們引入了一個新的開關:"delims=,",它的含義是:以逗號作為被處理的字符串的分隔符號。
在批處理中,指定分隔符號的方法是:添加一個形如 "delims=符號列表" 的開關,這樣,被處理的每行字符串都會被符號列表中羅列出來的符號切分開來。
需要注意的是:如果沒有指定"delims=符號列表"這個開關,那么,for /f 語句默認以空格鍵或跳格鍵作為分隔符號。請把[txt1]中不同位置上的標點符號改為空格或跳格,再運行[code4]試試。
進階話題:如果我要指定的符號不止一個,該怎么辦?
在上面的講解中,我提到了指定分隔符號的方法:添加一個形如"delims=符號列表"的開關。不知道你注意到沒有,我的說法是"符號列表"而非"符號",這是大有講究的,因為,你可以一次性指定多個分隔符號!
還是以[txt1]為例,把[code6]再改造一下:
[code7]
[result3]
[code7]的執行過程是:逐行讀取test.txt中的內容,以點號和逗號切分每一行的內容(不存在點號和逗號的行,則不再切分,為了描述的方便,我們把被點號或逗號切分的一個一個的字符串片段,稱之為節),然后,for /f 會提取第一節的內容作為最終結果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串被切分成了兩個以上的節,但是,[code7]的代碼只會提取第一節字符串的內容,因為 for /f 語句默認只提取第一節的符串。
(三) 定點提取:tokens=
for /f 是個十分強大的家伙。
如果說,for語句是批處理中最強大的語句的話,那么,for /f 就是精華中的精華。
for /f 的強大,和它擁有眾多的開關密切相關。因為開關眾多,所以用法復雜,本章將分成若干小節,為大家逐一介紹強大的 for /f 語句。
(一) 為解析文本而生:for /f 的基本用法
所有的對象,無論是文件、窗體、還是控件,在所有的非機器語言看來,無外乎都是形如"c:\test.txt"、"CWnd"之類的文本信息;而所有的對象,具體的如ini文件中的某條配置信息、注冊表中的某個鍵值、數據庫中的某條記錄……都只有轉化為具有一定格式的文本信息,方可被代碼識別、操控。可以說,編程的很大一部分工作,都是在絞盡腦汁想方設法如何提取這些文本信息。
而提取文本信息,則是for /f的拿手好戲:讀取文件內容;提取某幾行字符;截取某個字符片段;對提取到的內容再切分、打亂、雜糅……只要你所能想到的花樣,for /f 都會想方設法幫你辦到,因為,for /f 就是被設計成專門用于解析文本的。
先來看個例子。
假如有個文本文件test.txt,內容如下:
[txt1]
引用:
論壇的目標是:不求最大,但求最好,做最實用的批處理論壇。
論壇地址:bbs.bathome.cn。
這里是:新手晉級的福地,高手論劍的天堂。
[code4]
復制內容到剪貼板
這段代碼,主要是讓你樹立這樣一種觀念:讀取文本文件的內容,請使用 for /f 語句!代碼:
@echo off
for /f %%i in (test.txt) do echo %%i
pause
進階話題:for /f 語句是把整個test.txt一次性顯示出來的?
在這段代碼中,雖然執行結果是把test.txt中的所有內容都顯示出來了,貌似 for /f 語句是把整個test.txt一次性顯示到屏幕上,實際上并非如此。
無論for語句做何種變化,它的執行過程仍然遵循基本的for流程:依次處理每個元素,直到所有的元素都被處理為止。只不過在for /f語句中,這里的元素是指文件中的每一行,也就是說,for /f 語句是以行為單位處理文本文件的。這是一條極為重要的規則,在上一章中也強調過它的重要性,希望在接下來的學習過程中,你能時刻牢記這一原則,那么,很多問題將會迎刃而解。以下是驗證這一說法的演示代碼(在[code4]的基礎上添加了&pause語句):
[code5]
復制內容到剪貼板
(二) 切分字符串的利器:delims=代碼:
@echo off
for /f %%i in (test.txt) do echo %%i&pause
pause
也許你對[code4]這段代碼不屑一顧:不就是把test.txt的內容顯示出來了么?好像用處不大啊。
好吧,我們來玩個魔術。
還是[txt1]這段文本,把[code4]改造一下:
[code6]
復制內容到剪貼板
再次運行test.cmd,看到什么變化了嗎?!代碼:
@echo off
for /f "delims=," %%i in (test.txt) do echo %%i
pause
[result2]
復制內容到剪貼板
結果,你驚奇地發現,每行第一個逗號之后的所有內容都不見了(如果有不存在逗號的行,則保留原樣),也就說,你成功地提取到了每行第一個逗號之前的所有內容!代碼:
論壇的目標是:不求最大
論壇地址:bbs.bathome.cn。
這里是:新手晉級的福地
請按任意鍵繼續...
試想一下,這段代碼會有什么用呢?
如果別人給了你一個軟件清單,每行都是"英文軟件名(逗號)中文軟件名"的格式,而你卻只想保留英文名的時候,這段代碼將是多么有用啊!再假設,有這么一個IP文件,第一列是數字格式的IP地址,第二列是具體的空間地址,列與列之間用逗號分隔,而你想提取其中數字格式的IP,呵呵,我不說你也知道該怎么辦了吧?
要是文本內容不是以逗號分隔,而是以其他符號分隔,那么,把"delims=,"的逗號換成相應的符號就可以了。
在這里,我們引入了一個新的開關:"delims=,",它的含義是:以逗號作為被處理的字符串的分隔符號。
在批處理中,指定分隔符號的方法是:添加一個形如 "delims=符號列表" 的開關,這樣,被處理的每行字符串都會被符號列表中羅列出來的符號切分開來。
需要注意的是:如果沒有指定"delims=符號列表"這個開關,那么,for /f 語句默認以空格鍵或跳格鍵作為分隔符號。請把[txt1]中不同位置上的標點符號改為空格或跳格,再運行[code4]試試。
進階話題:如果我要指定的符號不止一個,該怎么辦?
在上面的講解中,我提到了指定分隔符號的方法:添加一個形如"delims=符號列表"的開關。不知道你注意到沒有,我的說法是"符號列表"而非"符號",這是大有講究的,因為,你可以一次性指定多個分隔符號!
還是以[txt1]為例,把[code6]再改造一下:
[code7]
復制內容到剪貼板
結果顯示:代碼:
@echo off
for /f "delims=.," %%i in (test.txt) do echo %%i
pause
[result3]
復制內容到剪貼板
這樣,第一個點號或第一個逗號之前的內容都被提取出來了。代碼:
論壇的目標是:不求最大
論壇地址:bbs
這里是:新手晉級的福地
請按任意鍵繼續...
[code7]的執行過程是:逐行讀取test.txt中的內容,以點號和逗號切分每一行的內容(不存在點號和逗號的行,則不再切分,為了描述的方便,我們把被點號或逗號切分的一個一個的字符串片段,稱之為節),然后,for /f 會提取第一節的內容作為最終結果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串被切分成了兩個以上的節,但是,[code7]的代碼只會提取第一節字符串的內容,因為 for /f 語句默認只提取第一節的符串。
(三) 定點提取:tokens=
-------------
未完成待續,參考: http://bbs.bathome.cn/thread-2189-1-3.html
posted on 2008-11-21 17:35 void 閱讀(607) 評論(0) 編輯 收藏 所屬分類: 批處理