批處理 for語句從入門到精通系列教程_第1頁
批處理 for語句從入門到精通系列教程_第2頁
批處理 for語句從入門到精通系列教程_第3頁
批處理 for語句從入門到精通系列教程_第4頁
批處理 for語句從入門到精通系列教程_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、系列教程for語句從入門到精通2009.2.12更新_版主提醒_為了避免影響技術討論、提高看帖的舒適性,請大家不要在此帖下跟無實質(zhì)內(nèi)容的口水帖,特別是純頂、純支持、純感謝、路過之類的帖子,管理人員將不定期清理此類回帖,請大家多參與討論少灌水,與人方便,終將給自己帶來方便,謝謝合作。_批處理是一門簡單的腳本語言,雖然不能獨當一面,但是,若作為工作中的輔助工具,絕對會讓大家有隨用隨寫、稱心如意的暢快感。和其他語言相比,批處理語言有其先天性的優(yōu)勢:1、系統(tǒng)自帶,無需另行安裝;2、命令少,語句簡潔,上手非??欤?、編寫出來的腳本小巧玲瓏,隨寫隨用;但是,因為它以命令行方式工作,操作多有不便,在圖形界面

2、大行其道的windows世界里,多多少少會讓大眾望而卻步;就算是對命令行有好感的新手,面對微軟有如天書的幫助文件,很多人也會敗下陣來,因此,論壇里很多會員也發(fā)出了編寫系統(tǒng)的批處理教程的呼聲。編寫系統(tǒng)的批處理新手教程,一直是論壇管理層討論的熱點問題,但是,各位管理人員大多都有工作在身,而系統(tǒng)的教程涉及的面是如此之廣,面對如此浩大的工程,僅憑一兩個人的力量,是難以做好的,因此,本人退而求其次,此次發(fā)布的教程,以專題的形式編寫,日后人手漸多之后,再考慮組織人力編寫全面的教程。之所以選擇最難的for,一是覺得for最為強大,是大多數(shù)人最希望掌握的;二是若寫其他命令教程,如果沒有for的基礎,展開來講解

3、會無從下手;三是for也是批處理中最復雜最難掌握的語句,把它攻克了,批處理的學習將會一片坦途。這次的for語句系列教程,打算按照for語句的5種句式逐一展開,在講解 for /f 的時候,會穿插講解批處理中一個最為關鍵、也是新手最容易犯錯的概念:變量延遲,大綱如下: 引用:一 前言二 for語句的基本用法三 for /f (含變量延遲)四 for /r五 for /d六 for /l樓主熱帖 · 系列教程for語句從入門到精通2009.2.12更新 · chm文件反編譯器V1.22008.3.13 · 照片整理器2008-10-12 搜索更多相關主題的帖子: 語句

4、 入門 教程 閉關ing,非誠勿擾。尺有所短寸有所長,學好批處理沒商量;考慮問題復雜化,解決問題簡潔化。 UID5 帖子627 精華5 積分3794 PB2122  技術5  聲望3  閱讀權限255 來自四川成都 在線時間821 小時 注冊時間2007-10-25 最后登錄2009-3-8 失蹤天數(shù):0查看詳細資料引用 回復 Top 每一篇文章的背后都苦苦守候著一顆渴望共鳴的心靈!namejm 樓主 昵稱 塵土飛揚管理員 版主申請&任免版主辦公室論壇公告意見反饋&a

5、mp;交換鏈接論壇總版規(guī)帖子627 積分3794 技術5  聲望3  注冊時間2007-10-25 · 發(fā)短消息 · 當前在線 2樓 大 中 小 發(fā)表于 2008-10-16 21:10  只看該作者 所發(fā)主題 加為好友 一、前言在批處理中,for是最為強大的命令語句,它的出現(xiàn),使得解析文本內(nèi)容、遍歷文件路徑、數(shù)值遞增/遞減等操作成為可能;配合if、call、goto等流程控制語句,更是可以實現(xiàn)腳本復雜的自動化、智能化操作;合理使用for語句,還能使代碼大為簡化,免除各位編寫大量重復語句之苦。而能否熟練使用for語

6、句,已經(jīng)成為衡量一個人批處理水平高低最主要的標準。在這個系列教程中,我將通過實際應用中頻繁出現(xiàn)的例子,帶領大家步入for語句的神奇之門,一步步邁向for語句的魔幻殿堂,使得大家在實際的應用中,能獨立寫出簡潔高效的代碼,在批處理的世界里自由馳騁。注意:以下的講解,都是基于簡體中文版Windows XP Pro SP3的操作系統(tǒng)環(huán)境。閉關ing,非誠勿擾。尺有所短寸有所長,學好批處理沒商量;考慮問題復雜化,解決問題簡潔化。 UID5 帖子627 精華5 積分3794 PB2122  技術5  聲望3  閱讀權限255 

7、來自四川成都 在線時間821 小時 注冊時間2007-10-25 最后登錄2009-3-8 失蹤天數(shù):0查看詳細資料引用 回復 Top 若想迅速地搜索到相關的討論帖,請以己度人,給所發(fā)的每個主題帖取個好標題。namejm 樓主 昵稱 塵土飛揚管理員 版主申請&任免版主辦公室論壇公告意見反饋&交換鏈接論壇總版規(guī)帖子627 積分3794 技術5  聲望3  注冊時間2007-10-25 · 發(fā)短消息 · 當前在線 3樓 大 中 小 發(fā)表于 2008-10-16 21:10&

8、#160; 只看該作者 所發(fā)主題 加為好友 二、for語句的基本用法2008.11.9更新正如色彩繽紛的七彩光芒是由紅綠藍三原色構成的一樣,最復雜的for語句,也有其基本形態(tài),它的模樣是這樣的:在cmd窗口中: 復制內(nèi)容到剪貼板 代碼:for %I in (command1) do command2在批處理文件中: 復制內(nèi)容到剪貼板 代碼:for %I in (command1) do command2之所以要區(qū)分cmd窗口和批處理文件兩種環(huán)境,是因為在這兩種環(huán)境下,命令語句表現(xiàn)出來的行為雖然基本一樣,但是在細節(jié)上還是稍有不同,最明顯的一個差異就是:在cmd窗口中,for之后的形式變量I必須使

9、用單百分號引用,即%I;而在批處理文件中,引用形式變量I必須使用雙百分號,即%I。為了方便起見,若不是特別強調(diào),以下的講解都以批處理文件環(huán)境為例。我們先來看一下for語句的基本要素都有些什么: 引用:1、for、in和do是for語句的關鍵字,它們?nèi)齻€缺一不可;2、%I是for語句中對形式變量的引用,就算它在do后的語句中沒有參與語句的執(zhí)行,也是必須出現(xiàn)的;3、in之后,do之前的括號不能省略;4、command1表示字符串或變量,command2表示字符串、變量或命令語句;現(xiàn)在,你可能已經(jīng)會寫一個簡單的for語句了,比如:code1 復制內(nèi)容到剪貼板 代碼:echo offfor %I in

10、 () do echo %Ipause保存為批處理文件并執(zhí)行,將會在彈出的批處理窗口中看到這樣的信息:result1 引用:請按任意鍵繼續(xù).很快地,你會覺得這個for語句是如此的簡單,簡單到你絲毫感受不出它的強大:這個for語句,和我直接用echo語句沒什么兩樣??!是的,演示代碼永遠都只是演示而已,就像大多數(shù)高級語言的教科書一樣,在引導新手學習的時候,基本上都是千篇一律地告訴大家如何編寫一個能顯示 hello world! 的窗口,從這些演示代碼中,你看不到它們具有多少實用性,你只是感到有點好奇:咦,居然彈出了一個窗口?片刻之后,你就會覺得索然無味。那好吧,為了讓大家對for更加感興趣,我們先

11、來分析一下for語句的一些注意事項,之后,再讓大家看看更為強大的for語句實例。 引用:1、for語句的形式變量I,可以換成26個字母中的任意一個,這些字母會區(qū)分大小寫,也就是說,%I和%i會被認為不是同一個變量;形式變量I還可以換成其他的字符,但是,為了不與批處理中的%0%9這10個形式變量發(fā)生沖突,請不要隨意把%I替換為%0 %9中的任意一個;2、in和do之間的command1表示的字符串或變量可以是一個,也可以是多個,每一個字符串或變量,我們稱之為一個元素,每個元素之間,用空格鍵、跳格鍵、逗號或等號分隔;3、for語句依次提取command1中的每一個元素,把它的值賦予形式變量I,帶到

12、do后的command2中參與命令的執(zhí)行;并且每次只提取一個元素,然后執(zhí)行一次do后的命令語句,而無論這個元素是否被帶到command2中參與了command2的運行;當執(zhí)行完一次do后的語句之后,再提取command1中的下一個元素,再執(zhí)行一次command2,如此循環(huán),直到command1中的所有元素都已經(jīng)被提取完畢,該for語句才宣告執(zhí)行結束;其中,第3點是最為關鍵的,它描述了for語句的執(zhí)行過程,是for語句的精髓所在,大家一定要牢記這一條,才能深刻理解更為復雜的for流程。有了以上的基礎,我們再來看一個例子,這個例子修改了code1的部分內(nèi)容,結果將大不一樣:code2 復制內(nèi)容到剪

13、貼板 代碼:echo offfor %I in (bbs,bathome,cn) do echo %Ipause和code1的執(zhí)行結果result1相比,result2發(fā)生了如下變化:1、顯示結果分成了3行(不算最后一行中文提示);2、每一行都從逗號處被切分;如果把 這個字符串中的點號換為空格、跳格或等號,執(zhí)行結果將和example2的執(zhí)行結果別無二致。現(xiàn)在,我們來分析一下code2代碼中for語句的執(zhí)行過程:首先,for語句以逗號為分隔符,把 bbs,bathome,cn 這個字符串切分成三個元素:bbs、bathome和cn,由此決定了do后的語句將會被執(zhí)行3次;然后,第一次執(zhí)行過程是這樣

14、的:先把 bbs 這個字符串作為形式變量I的值,帶入do后的語句中加以執(zhí)行,也就是執(zhí)行 echo %I 語句,此時的I值為bbs,因此,第一次執(zhí)行的結果,將會在屏幕上顯示bbs這個字符串;第二次執(zhí)行和第一次執(zhí)行的過程是一樣的,只不過此時I的值已經(jīng)被替換為command1中的第二個元素了,也就是 bathome 這個字符串;如此循環(huán),當?shù)谌蝒cho執(zhí)行完畢之后,整條for語句才算執(zhí)行完畢,此時,將執(zhí)行下一條語句,也就是pause命令。其實,這個例子只比上一個例子多了一點花樣,有趣了那么一點點:一條for語句的執(zhí)行結果居然被分成了3行!為了讓大家見識一下for的真正威力,本人絞盡腦汁,翻帖無數(shù),

15、不得要領,萬般無奈之下,只好亮出了塵封在箱底多年的一段代碼:檢測當前硬盤都有哪些分區(qū)_code3 復制內(nèi)容到剪貼板 代碼:echo offset str=c d e f g h i j k l m n o p q r s t u v w x y zecho 當前硬盤的分區(qū)有:for %i in (%str%) do if exist %i: echo %i:pause這段代碼能檢測硬盤都有哪些分區(qū),包括U盤和移動硬盤的分區(qū),但是,當光驅(qū)中有盤的時候,也會被列出來,這是本代碼的一個缺憾,在以后的講解中,我將向大家講述如何消除這個瑕疵,敬請關注本系列的后續(xù)章節(jié)。高級應用:想知道當前目錄下都有哪些文

16、件嗎?請用下面的代碼: 復制內(nèi)容到剪貼板 代碼:echo offfor %i in (*.*) do echo "%i"pause想列出當前目錄下所有的文本文件嗎?請用下面的代碼: 復制內(nèi)容到剪貼板 代碼:echo offfor %i in (*.txt) do echo "%i"pause想列出只用兩個字符作為文件名的文本文件嗎?請用下面的代碼: 復制內(nèi)容到剪貼板 代碼:echo offfor %i in (?.txt) do echo "%i"pause題外話:1、列出當前目錄下各種文件的方法,最簡單的還是用dir命令,但是,從以

17、上代碼中,各位可以加深對for語句執(zhí)行流程的理解(用到了通配符*和?);2、注意:以上代碼不能列出含有隱藏或系統(tǒng)屬性的文件;練習:用for語句建立test1.txt、test2.txt和test3.txt三個文本文件。更全面的練習請看這個帖子:for語句從入門到精通配套練習題本帖最近評分記錄 · pusofalse PB +10 感謝你為新手提供的便利。 2008-10-16 21:23 · pusofalse 聲望 +1 感謝你為新手提供的便利。 2008-10-16 21:23 閉關ing,非誠勿擾。尺有所短寸有所長,學好批處理沒商量;考慮問題復雜化,解決問題簡潔化。

18、UID5 帖子627 精華5 積分3794 PB2122  技術5  聲望3  閱讀權限255 來自四川成都 在線時間821 小時 注冊時間2007-10-25 最后登錄2009-3-8 失蹤天數(shù):0查看詳細資料引用 回復 Top 每一篇文章的背后都苦苦守候著一顆渴望共鳴的心靈!namejm 樓主 昵稱 塵土飛揚管理員 版主申請&任免版主辦公室論壇公告意見反饋&交換鏈接論壇總版規(guī)帖子627 積分3794 技術5  聲望3 

19、0;注冊時間2007-10-25 · 發(fā)短消息 · 當前在線 4樓 大 中 小 發(fā)表于 2008-10-16 21:10  只看該作者 所發(fā)主題 加為好友 三、文本解析顯神威:for /f 用法詳解2009.2.10更新前言for /f 是個十分強大的家伙。如果說,for語句是批處理中最強大的語句的話,那么,for /f 就是精華中的精華。for /f 的強大,和它擁有眾多的開關密切相關。因為開關眾多,所以用法復雜,本章將分成若干小節(jié),為大家逐一介紹強大的 for /f 語句。(一) 為解析文本而生:for /f 的基本用法所有的對象,無論是文件、窗體、

20、還是控件,在所有的非機器語言看來,無外乎都是形如"c:test.txt"、"CWnd"之類的文本信息;而所有的對象,具體的如ini文件中的某條配置信息、注冊表中的某個鍵值、數(shù)據(jù)庫中的某條記錄都只有轉(zhuǎn)化為具有一定格式的文本信息,方可被代碼識別、操控??梢哉f,編程的很大一部分工作,都是在想方設法絞盡腦汁如何提取這些文本信息。而提取文本信息,則是for /f的拿手好戲:讀取文件內(nèi)容;提取某幾行字符;截取某個字符片段;對提取到的內(nèi)容再切分、打亂、雜糅只要你所能想到的花樣,for /f 都會想方設法幫你辦到,因為,for /f 就是被設計成專門用于解析文本的。先來

21、看個例子。假如有個文本文件test.txt,內(nèi)容如下:txt1 引用:論壇的目標是:不求最大,但求最好,做最實用的批處理論壇。論壇地址:。這里是:新手晉級的福地,高手論劍的天堂。那么,將如下代碼保存為test.cmd,并放在test.txt同一目錄下運行,將會在屏幕上原樣顯示test.txt的內(nèi)容:code4 復制內(nèi)容到剪貼板 代碼:echo offfor /f %i in (test.txt) do echo %ipause這段代碼,主要是讓你樹立這樣一種觀念:讀取文本文件的內(nèi)容,請使用 for /f 語句!進階話題:for /f 語句是把整個test.txt一次性顯示出來的?在這段代碼中,

22、雖然執(zhí)行結果是把test.txt中的所有內(nèi)容都顯示出來了,貌似 for /f 語句是把整個test.txt一次性顯示到屏幕上,實際上并非如此。無論for語句做何種變化,它的執(zhí)行過程仍然遵循基本的for流程:依次處理每個元素,直到所有的元素都被處理為止。只不過在for /f語句中,這里的元素是指文件中的每一行,也就是說,for /f 語句是以行為單位處理文本文件的。這是一條極為重要的規(guī)則,在上一章中也強調(diào)過它的重要性,希望在接下來的學習過程中,你能時刻牢記這一原則,那么,很多問題將會迎刃而解。以下是驗證這一說法的演示代碼(在code4的基礎上添加了&pause語句):code5 復制內(nèi)容

23、到剪貼板 代碼:echo offfor /f %i in (test.txt) do echo %i&pausepause(二) 切分字符串的利器:delims=也許你對code4這段代碼不屑一顧:不就是把test.txt的內(nèi)容顯示出來了么?好像用處不大啊。好吧,我們來玩?zhèn)€魔術。還是txt1這段文本,把code4改造一下:code6復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=," %i in (test.txt) do echo %ipause再次運行test.cmd,看到什么變化了嗎?!result2 復制內(nèi)容到剪貼板 代碼:論壇的目標是

24、:不求最大論壇地址:。這里是:新手晉級的福地請按任意鍵繼續(xù).結果,你驚奇地發(fā)現(xiàn),每行第一個逗號之后的所有內(nèi)容都不見了(如果有不存在逗號的行,則保留原樣),也就說,你成功地提取到了每行第一個逗號之前的所有內(nèi)容!試想一下,這段代碼會有什么用呢?如果別人給了你一個軟件清單,每行都是"英文軟件名(逗號)中文軟件名"的格式,而你卻只想保留英文名的時候,這段代碼將是多么有用??!再假設,有這么一個IP文件,第一列是數(shù)字格式的IP地址,第二列是具體的空間地址,列與列之間用逗號分隔,而你想提取其中數(shù)字格式的IP,呵呵,我不說你也知道該怎么辦了吧?要是文本內(nèi)容不是以逗號分隔,而是以其他符號分隔

25、,那么,把"delims=,"的逗號換成相應的符號就可以了。在這里,我們引入了一個新的開關:"delims=,",它的含義是:以逗號作為被處理的字符串的分隔符號。在批處理中,指定分隔符號的方法是:添加一個形如 "delims=符號列表" 的開關,這樣,被處理的每行字符串都會被符號列表中羅列出來的符號切分開來。需要注意的是:如果沒有指定"delims=符號列表"這個開關,那么,for /f 語句默認以空格鍵或跳格鍵作為分隔符號。請把txt1中不同位置上的標點符號改為空格或跳格,再運行code4試試。進階話題:如果我要

26、指定的符號不止一個,該怎么辦?在上面的講解中,我提到了指定分隔符號的方法:添加一個形如"delims=符號列表"的開關。不知道你注意到?jīng)]有,我的說法是"符號列表"而非"符號",這是大有講究的,因為,你可以一次性指定多個分隔符號!還是以txt1為例,把code6再改造一下:code7 復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=.," %i in (test.txt) do echo %ipause結果顯示:result3 復制內(nèi)容到剪貼板 代碼:論壇的目標是:不求最大論壇地址:bbs這里是

27、:新手晉級的福地請按任意鍵繼續(xù).這樣,第一個點號或第一個逗號之前的內(nèi)容都被提取出來了。code7的執(zhí)行過程是:逐行讀取test.txt中的內(nèi)容,以點號和逗號切分每一行的內(nèi)容(不存在點號和逗號的行,則不再切分,為了描述的方便,我們把被點號或逗號切分的一個一個的字符串片段,稱之為節(jié)),然后,for /f 會提取第一節(jié)的內(nèi)容作為最終結果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串被切分成了兩個以上的節(jié),但是,code7的代碼只會提取第一節(jié)字符串的內(nèi)容,因為 for /f 語句默認只提取第一節(jié)的符串。(三) 定點提?。簍okens=上一節(jié)在講解 delims= 的時候,我一再強調(diào) for /f

28、 默認只能提取到第一節(jié)的內(nèi)容,現(xiàn)在我們來思考一個問題:如果我要提取的內(nèi)容不在第一節(jié)上,那怎么辦?這回,就該輪到 tokens= 出馬了。tokens= 后面一般跟的是數(shù)字,如 tokens=2,也可以跟多個,但是每個數(shù)字之間用逗號分隔,如 tokens=3,5,8,它們的含義分別是:提取第2節(jié)字符串、提取第3、第5和第8節(jié)字符串。注意,這里所說的“節(jié)”,是由 delims= 這一開關劃分的,它的內(nèi)容并不是一成不變的。下面來看一個例子:txt2 復制內(nèi)容到剪貼板 代碼:尺有所短,寸有所長,學好批處理沒商量,考慮問題復雜化,解決問題簡潔化。對txt2這段文本,假設它們保存在文件test.txt中,

29、如果我想提取“學好批處理沒商量”這句話,該如何寫代碼呢?我們稍微觀察一下txt2就會發(fā)現(xiàn),如果以逗號作為切分符號,就正好可以把“學好批處理沒商量”化為單獨的一“節(jié)”,結合上一節(jié)的講解,我們知道,"delims=," 這個開關是不可缺少的,而要提取的內(nèi)容在以逗號切分的第3節(jié)上,那么,tokens= 后面的數(shù)字就應該是3了,最終的代碼如下:code8 復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=, tokens=3" %i in (test.txt) do echo %ipause如果我們現(xiàn)在要提取的不只一個“節(jié)”,而是多個,那又怎

30、么辦呢?比如,要提取以逗號切分的第2節(jié)和第5節(jié)字符串,是寫成這樣嗎?code9 復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=, tokens=2,5" %i in (test.txt) do echo %ipause運行批處理后發(fā)現(xiàn),執(zhí)行結果只顯示了第2節(jié)的內(nèi)容。原來,echo 后面的 %i 只接收到了 tokens=2,5 中第一個數(shù)值2所代表的那個字符串,而第二個數(shù)值5所代表的字符串因為沒有變量來接收,所以就無法在執(zhí)行結果中顯示出來了。那么,要如何接收 tokens= 后面多個數(shù)值所指代的內(nèi)容呢?for /f 語句對這種情況做如下規(guī)定:如果 t

31、okens= 后面指定了多個數(shù)字,如果形式變量為%i,那么,第一個數(shù)字指代的內(nèi)容用第一個形式變量%i來接收,第二個數(shù)字指代的內(nèi)容用第二個形式變量%j來接收,第三個數(shù)字指代的內(nèi)容用第三個形式變量%k來接收第N個數(shù)字指代的內(nèi)容用第N個形式變量來接收,其中,形式變量遵循字母的排序,第N個形式變量具體是什么符號,由第一個形式變量來決定:如果第一個形式變量是%i,那么,第二個形式變量就是%j;如果第一個形式變量用的是%x,那么,第二個形式變量就是%y。現(xiàn)在回頭去看code9,你應該知道如何修改才能滿足題目的要求了吧?修改結果如下:code10 復制內(nèi)容到剪貼板 代碼:echo offfor /f &qu

32、ot;delims=, tokens=2,5" %i in (test.txt) do echo %i %jpause如果有這樣一個要求:顯示txt2中的內(nèi)容,但是逗號要替換成空格,如何編寫代碼?結合上面所學的內(nèi)容,稍加思索,你可能很快就得出了答案:code11 復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=, tokens=1,2,3,4,5" %i in (test.txt) do echo %i %j %k %l %mpause寫完之后,你可能意識到這樣一個問題:假如要提取的“節(jié)”數(shù)不是5,而是10,或者20,或者更多,難道我也得從1

33、寫到10、20或者更多嗎?有沒有更簡潔的寫法呢?答案是有的,那就是:如果要提取的內(nèi)容是連續(xù)的多“節(jié)”的話,那么,連續(xù)的數(shù)字可以只寫最小值和最大值,中間用短橫連接起來即可,比如 tokens=1,2,3,4,5 可以簡寫為 tokens=1-5 。還可以把這個表達式寫得更復雜一點:tokens=1,2-5,tokens=1-3,4,5,tokens=1-4,5怎么方便就怎么寫吧。大家可能還看到一種比較怪異的寫法:code12 復制內(nèi)容到剪貼板 代碼:for /f "delims=, tokens=1,*" %i in (test.txt) do echo %i %jpause

34、結果,第一個逗號不見了,取代它的是一個空格符號,其余部分保持不變。其中奧妙就在這個星號上面。tokens=后面所接的星號具備這樣的功能:字符串從左往右被切分成緊跟在*之前的數(shù)值所表示的節(jié)數(shù)之后,字符串的其余部分保持不變,整體被*所表示的一個變量接收。理論講解是比較枯燥的,特別是為了嚴密起見,還使用了很多限定性的修飾詞,導致句子很長,增加了理解的難度,我們還是結合code12來講解一下吧。txt2 的內(nèi)容被切分,切分符號為逗號,當切分完第一節(jié)之后,切分動作不再繼續(xù)下去,因為 tokens=1,* 中,星號前面緊跟的是數(shù)字1;第一節(jié)字符串被切分完之后,其余部分字符串不做任何切分,整體作為第二節(jié)字符

35、串,這樣,txt2就被切分成了兩節(jié),分別被變量%i和變量%j接收。以上幾種切分方式可以結合在一起使用。不知道下面這段代碼的含義你是否看得懂,如果看不懂的話,那就運行一下代碼,然后反復揣摩,你一定會更加深刻地理解本節(jié)所講解的內(nèi)容的:code13 復制內(nèi)容到剪貼板 代碼:echo offfor /f "delims=, tokens=1,3-4,*" %i in (test.txt) do echo %i %j %k %lpause(四) 跳過無關內(nèi)容,直奔主題:skip=n很多時候,有用的信息并不是貫穿文本內(nèi)容的始終,而是位于第N行之后的行內(nèi),為了提高文本處理的效率,或者不受

36、多余信息的干擾,for /f 允許你跳過這些無用的行,直接從第N+1行開始處理,這個時候,就需要使用參數(shù) skip=n,其中,n是一個正整數(shù),表示要跳過的行數(shù)。例如:code14 復制內(nèi)容到剪貼板 代碼:echo offfor /f "skip=2" %i in (test.txt) do echo %ipause這段代碼將跳過頭兩行內(nèi)容,從第3行起顯示test.txt中的信息。(五) 忽略以指定字符打頭的行:eol=在cmd窗口中敲入:for /?,相關的解釋為: 引用:eol=c          &

37、#160;- 指一個行注釋字符的結尾(就一個)引用:FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k    會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行第一條解釋狗屁不通,頗為費解:行注釋字符的結尾是什么意思?“(就一個)”怎么回事?結合第二條解釋,才知道eol有忽略指定行的功能。但是,這兩條解釋是互相矛盾的:到底是忽略以指定字符打頭的行,還是忽略以指定字符結尾的行?實踐是檢驗真理的唯一標準,還是用代碼來檢驗一下eol的作用吧:code15

38、 復制內(nèi)容到剪貼板 代碼:echo offfor /f "eol=;" %i in (test.txt) do echo %ipause結果,那些以分號打頭的行沒有顯示出來。由此可見,第二條解釋是正確的,eol= 的準確含義是:忽略以指定字符打頭的行。而第一條的“結尾”純屬微軟在信口開河。那么,“(就一個)”又作何解釋呢?試試這個代碼:code16 復制內(nèi)容到剪貼板 代碼:echo offfor /f "eol=,;" %i in (test.txt) do echo %ipause此時,屏幕上出現(xiàn) 此時不應有 ;"。 的報錯信息??梢姡谥付?/p>

39、字符的時候,只能指定1個在很多時候,我對這樣的設計頗有微詞而又無可奈何:為什么只能指定1個而不是多個?要忽略多個還得又是if又是findstr加管道來多次過濾,那效率實在太低下了能用到的功能基本上都提供,但是卻又做不到更好,批處理,你的功能為什么那么弱?不知道大家注意到?jīng)]有,如果test.txt中有以分號打頭的行,那么,這些行在代碼code14的執(zhí)行結果中將憑空消失。原來,for /f 語句是默認忽略以分號打頭的行內(nèi)容的,正如它默認以空格鍵或跳格鍵作為字符串的切分字符一樣。很多時候,我們可以充分利用這個特點,比如,在設計即將用for讀取的配置文件的時候,可以在注釋文字的行首加上分號,例如在編寫

40、病毒文件查殺代碼的時候,可以通過for語句來讀取病毒文件列表,那么,病毒文件列表.ini這個配置文件可以這樣寫: 引用:;以下是常見的病毒文件,請見一個殺一個_;copyleft:沒有qq.exemsn.exeiexplore.exe如果要取消這個默認設置,可選擇的辦法是:1、為eol=指定另外一個字符;2、使用 for /f "eol=" 語句,也就是說,強制指定字符為空,就像對付delims=一樣。(六)如何決定該使用 for /f 的哪種句式?(兼談usebackq的使用)for /f %i in () do () 語句有好幾種變形語句,不同之處在于第一個括號里的內(nèi)容

41、:有的是用單引號括起來,有的是用雙引號包住,有的不用任何符號包裹,具體格式為: 引用:1、for /f %i in (文件名) do ()2、for /f %i in ('命令語句') do ()3、for /f %i in ("字符串") do ()看到這里,我想很多人可能已經(jīng)開始犯了迷糊了:如果要解決一個具體問題,面對這么多的選擇,如何決定該使用哪一條呢?實際上,當我在上面羅列這些語句的時候,已經(jīng)有所提示了,不知道你是否注意到了。如果你一時無法參透其中奧妙,那也無妨,請聽我一一道來便是。1、當你希望讀取文本文件中的內(nèi)容的話,第一個括號中不用任何符號包裹,

42、應該使用的是第1條語句;例如:你想顯示test.txt中的內(nèi)容,那么,就使用 for /f %i in (test.txt) do echo %i;2、當你讀取的是命令語句執(zhí)行結果中的內(nèi)容的話,第一個括號中的命令語句必須使用單引號包裹,應該使用的是第2條語句;例如:你想顯示當前目錄下文件名中含有test字符串的文本文件的時候,應該使用 for /f %i in ('dir /a-d /b *test*.txt') do echo %i 這樣的語句;3、當你要處理的是一個字符串的時候,第一個括號中的內(nèi)容必須用雙引號括起來,應該是用的是第3條語句;例如:當你想把這串字符中的點號換為

43、短橫線并顯示出來的話,可以使用 for /f "delims=. tokens=1-3" %i in ("") do echo %i-%j-%k 這樣的語句。很顯然,第一個括號里是否需要用符號包裹起來,以及使用什么樣的符號包裹,取決于要處理的對象屬于什么類型:如果是文件,則無需包裹;如果是命令語句,則用單引號包裹;如果是字符串,則使用雙引號括起來。當然,事情并不是絕對如此,如果細心的你想到了批處理中難纏的特殊字符,你肯定會頭大如斗?;蛟S你頭腦中靈光一閃,已經(jīng)想到了一個十分頭痛的問題:在第1條語句中,如果文件名中含有空格或&,該怎么辦?照舊嗎?拿個

44、叫 test 1.txt 的文件來試試。你很快寫好了代碼,新建文件->碼字->保存為批處理,前后費時不到1分鐘:code17 復制內(nèi)容到剪貼板 代碼:echo offfor /f %i in (test 1.txt) do echo %ipause你興沖沖地雙擊批處理,運行后,屏幕上出現(xiàn)了可恥的報錯信息:系統(tǒng)找不到文件 test 。當你把 test 1.txt 換成 test&1.txt 后,更怪異的事情發(fā)生了:CMD窗口在你眼前一閃而過,然后,優(yōu)雅地消失了。你可能覺得自己的代碼寫錯了某些符號,你再仔細的檢查了一次,確認沒有筆誤,然后,你再次雙擊批處理,結果問題照舊;你開始

45、懷疑其他程序?qū)λ赡苡杏绊懀谑顷P掉其他窗口,再運行了一次,問題依舊;你不服氣地連續(xù)運行了好幾次,還是同樣的結果。怪哉!你一拍大腿,猛然想起了一件事:當路徑中含有特殊字符的時候,應該使用引號把路徑括起來。對,就是它了!但是,當你把代碼寫出來之后,你很快就焉了:for /f %i in ("test 1.txt") do echo %i,這不就是上面提到的第3條 for /f 命令的格式嗎?批處理會把 test 1.txt 這個文件名識別為字符串啊!你百無聊賴地在CMD窗口中輸入 for /? ,并重重地敲下了回車,漫無目的地在幫助信息中尋找,希望能找到點什么。結果還真讓你到

46、了點什么。你看到了這樣的描述: 引用:        usebackq        - 指定新語法已在下類情況中使用:                          在作為命令執(zhí)行一個后引號的字符串并且一個單         

47、0;                引號字符為文字字符串命令并允許在 filenameset                          中使用雙引號擴起文件名稱。但是,通讀一遍之后,你卻如墜五里霧中,不知所云。還好,下面有個例子,并配有簡單的說明: 引用:     

48、60;FOR /F "usebackq delims=" %i IN (set) DO echo %i    會枚舉當前環(huán)境中的環(huán)境變量名稱。你仔細對比了for /f語句使用usebackq和不使用usebackq時在寫法上的差別,很快就找到了答案:當使用了usebackq之后,如果第一個括號中是一條命令語句,那么,就要把單引號'改成后引號(鍵盤左上角esc鍵下面的那個按鍵,與在同一鍵位上)?;剡^頭去再看那段關于usebackq的描述,字斟句酌,反復揣摩,終于被你破譯了天機:usebackq 是一個增強型參數(shù),當使用了這個參數(shù)之后,原來的for語

49、句中第一個括號內(nèi)的寫法要做如下變動:如果第一個括號里的對象是一條命令語句的話,原來的單引號'要改為后引號;如果第一個括號里的對象是字符串的話,原來的雙引號"要改為單引號';如果第一個括號里的對象是文件名的話,要用雙引號"括起來。驗證一下,把code17改寫成如下代碼:code18 復制內(nèi)容到剪貼板 代碼:echo offfor /f "usebackqu" %i in ("test 1.txt") do echo %ipause測試通過!此時,你很可能會仰天長嘆:Shit,微軟這該死的機器翻譯!至于把code17代碼中

50、的空格換成&后,CMD窗口會直接退出,那是因為&是復合語句的連接符,CMD在預處理的時候,會優(yōu)先把&前后兩部分作為兩條語句來解析,而不是大家想象中的一條完整的for語句,從而產(chǎn)生了嚴重的語法錯誤。因為牽涉到預處理機制問題,不屬于本節(jié)要討論的內(nèi)容,在此不做詳細講解。這個時候,我們會吃驚地發(fā)現(xiàn),區(qū)區(qū)一條for語句,竟然有多達6種句型: 引用:1、for /f %i in (文件名) do ()2、for /f %i in ('命令語句') do ()3、for /f %i in ("字符串") do ()4、for /f "us

51、ebackq" %i in ("文件名") do ()5、for /f "usebackq" %i in (命令語句) do ()6、for /f "usebackq" %i in ('字符串') do ()其中,4、5、6由1、2、3發(fā)展而來,他們有這樣的對應關系:1->4、2->5、3->6。好在后3種情形并不常用,所以,牢牢掌握好前三種句型的適用情形就可以了,否則,要在這么多句型中確定選擇哪一條語句來使用,還真有點讓人頭腦發(fā)懵。至于 for /f 為什么要增加usebacq參數(shù),我只為

52、第4條語句找到了合理的解釋:為了兼容文件名中所帶的空格或&。它在第5、6條語句中為什么還有存在的必要,我也不是很明白,這有待于各位去慢慢發(fā)現(xiàn)。閉關ing,非誠勿擾。尺有所短寸有所長,學好批處理沒商量;考慮問題復雜化,解決問題簡潔化。 UID5 帖子627 精華5 積分3794 PB2122  技術5  聲望3  閱讀權限255 來自四川成都 在線時間821 小時 注冊時間2007-10-25 最后登錄2009-3-8 失蹤天數(shù):0查看詳細資料引用 回復 Top 若想迅

53、速地搜索到相關的討論帖,請以己度人,給所發(fā)的每個主題帖取個好標題。namejm 樓主 昵稱 塵土飛揚管理員 版主申請&任免版主辦公室論壇公告意見反饋&交換鏈接論壇總版規(guī)帖子627 積分3794 技術5  聲望3  注冊時間2007-10-25 · 發(fā)短消息 · 當前在線 5樓 大 中 小 發(fā)表于 2008-10-16 21:11  只看該作者 所發(fā)主題 加為好友 (七)變量延遲詳解2009.2.12更新變量延遲在for語句中起著至關重要的作用,不只是在for語句中,在其他的復合語句中,它也在幕后默默

54、地工作著,為了突出它的重要性,本節(jié)內(nèi)容在單獨的樓層中發(fā)出來,希望引起大家的重視。對于批處理新手而言,“變量延遲”這個概念很可能聞所未聞,但是,它卻像一堵橫亙在你前進道路上的無形高墻,你感受不到它的存在,但當你試圖往前沖時,它會把你狠狠地彈回來,讓你無法逾越、無功而返;而一旦找到了越過它的方法,你就會發(fā)現(xiàn),在for的世界里,前面已經(jīng)是一片坦途,而你對批處理的理解,又上升到了一個新的境界。例如,你編寫了這樣一個代碼:code19 復制內(nèi)容到剪貼板 代碼:echo offset num=0&&echo %num%pause你的本意是想對變量num賦值之后,再把這個值顯示出來,結果,顯

55、示出來的并不是0,而是顯示:ECHO 處于關閉狀態(tài)。之所以會出錯,是因為“變量延遲”這個家伙在作怪。在講解變量延遲之前,我們需要了解一下批處理的執(zhí)行過程,它將有助于我們深入理解變量延遲。批處理的執(zhí)行過程是怎樣的呢?“自上而下,逐條執(zhí)行”,我想,這個經(jīng)典的說法大家都已經(jīng)耳熟能詳了,沒事的時候倒著念,也還別有一番古韻呢_,但是,我想問大家的是,大家真的深刻地理解了這句話的含義了嗎?“自上而下”,這一條和我們本節(jié)的講解關系不大,暫時略過不說,后一條,“逐條執(zhí)行”和變量延遲有著莫大的干系,它是我們本節(jié)要關注的重點。很多人往往認為一行代碼就是一條語句,從而把“逐條執(zhí)行”與“逐行執(zhí)行”等同起來,這就大錯特

56、錯了。莫非“逐條執(zhí)行”里暗藏著玄機?正是如此?!爸饤l”并不等同于“逐行”。這個“條”,是“一條完整的語句”的意思,并不是指“一行代碼”。在批處理中,是不是一條完整的語句,并不是以行來論的,而是要看它的作用范圍。什么樣的語句才算“一條完整的語句”呢?1、在復合語句中,整個復合語句是一條完整的語句,而無論這個復合語句占用了多少行的位置。常見的復合語句有:for語句、ifelse語句、用連接符&、|和&&連接的語句,用管道符號|連接的語句,以及用括號括起來的、由多條語句組合而成的語句塊;2、在非復合語句中,如果該語句占據(jù)了一行的位置,則該行代碼為一條完整的語句。例如:code20復制內(nèi)容到剪貼板 代碼:echo offset num=0for /f %i in ('dir /a-d /b *.exe') do (    set /a num+=1    echo num 當前的值是 %num%)echo 當前目錄下共有 %num% 個exe文件dir /a-d /b *.txt|findstr "test">nul&&(    echo 存在含有 test 字符串的文本本件)|ec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論