void

          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>nul
          2> /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就會把它當字符串來循環,而不是文本.

          ==============

          ==============

          批處理是一門簡單的腳本語言,雖然不能獨當一面,但是,若作為工作中的輔助工具,絕對會讓大家有隨用隨寫、稱心如意的暢快感。

            和其他語言相比,批處理語言有其先天性的優勢:

            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語句的基本用法[2008.11.9更新]

            正如色彩繽紛的七彩光芒是由紅綠藍三原色構成的一樣,最復雜的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語句了,比如:
          [code1]
          復制內容到剪貼板
          代碼:
          @echo off
          for %%I in (bbs.bathome.cn) do echo %%I
          pause
            保存為批處理文件并執行,將會在彈出的批處理窗口中看到這樣的信息:
          [result1]
          引用:
          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流程。

            有了以上的基礎,我們再來看一個例子,這個例子修改了[code1]的部分內容,結果將大不一樣:
          [code2]
          復制內容到剪貼板
          代碼:
          @echo off
          for %%I in (bbs,bathome,cn) do echo %%I
          pause
            和[code1]的執行結果[result1]相比,[result2]發生了如下變化:

            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]
          復制內容到剪貼板
          代碼:
          @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盤和移動硬盤的分區,但是,當光驅中有盤的時候,也會被列出來,這是本代碼的一個缺憾,在以后的講解中,我將向大家講述如何消除這個瑕疵,敬請關注本系列的后續章節。

            高級應用:

            想知道當前目錄下都有哪些文件嗎?請用下面的代碼:
          復制內容到剪貼板
          代碼:
          @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]
          引用:
          論壇的目標是:不求最大,但求最好,做最實用的批處理論壇。
          論壇地址:bbs.bathome.cn。
          這里是:新手晉級的福地,高手論劍的天堂。
            那么,將如下代碼保存為test.cmd,并放在test.txt同一目錄下運行,將會在屏幕上原樣顯示test.txt的內容:
          [code4]
          復制內容到剪貼板
          代碼:
          @echo off
          for /f %%i in (test.txt) do echo %%i
          pause
            這段代碼,主要是讓你樹立這樣一種觀念:讀取文本文件的內容,請使用 for /f 語句!

            進階話題:for /f 語句是把整個test.txt一次性顯示出來的?
            在這段代碼中,雖然執行結果是把test.txt中的所有內容都顯示出來了,貌似 for /f 語句是把整個test.txt一次性顯示到屏幕上,實際上并非如此。
            無論for語句做何種變化,它的執行過程仍然遵循基本的for流程:依次處理每個元素,直到所有的元素都被處理為止。只不過在for /f語句中,這里的元素是指文件中的每一行,也就是說,for /f 語句是以行為單位處理文本文件的。這是一條極為重要的規則,在上一章中也強調過它的重要性,希望在接下來的學習過程中,你能時刻牢記這一原則,那么,很多問題將會迎刃而解。以下是驗證這一說法的演示代碼(在[code4]的基礎上添加了&pause語句):
          [code5]
          復制內容到剪貼板
          代碼:
          @echo off
          for /f %%i in (test.txt) do echo %%i&pause
          pause
              (二) 切分字符串的利器:delims=

            也許你對[code4]這段代碼不屑一顧:不就是把test.txt的內容顯示出來了么?好像用處不大啊。
            好吧,我們來玩個魔術。
            還是[txt1]這段文本,把[code4]改造一下:
          [code6]
          復制內容到剪貼板
          代碼:
          @echo off
          for /f "delims=," %%i in (test.txt) do echo %%i
          pause
            再次運行test.cmd,看到什么變化了嗎?!
          [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)  編輯  收藏 所屬分類: 批處理


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 嘉黎县| 丹东市| 丰顺县| 化德县| 南涧| 青海省| 邻水| 新民市| 阳谷县| 敦化市| 忻城县| 通渭县| 堆龙德庆县| 商河县| 双牌县| 桓台县| 娄底市| 平度市| 大同县| 铜陵市| 东丽区| 贺兰县| 荔浦县| 双鸭山市| 塔河县| 宁武县| 卢龙县| 雷州市| 肇庆市| 南和县| 博白县| 凤山市| 犍为县| 多伦县| 团风县| 美姑县| 兴仁县| 阿尔山市| 通山县| 宝鸡市| 股票|