西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → bat命令中的for循環(huán)語(yǔ)句詳細(xì)讀解

bat命令中的for循環(huán)語(yǔ)句詳細(xì)讀解

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西教程網(wǎng)時(shí)間:2018/1/9 20:37:43字體大。A-A+

作者:西西點(diǎn)擊:1次評(píng)論:0次標(biāo)簽: bat

  • 類型:動(dòng)作射擊大小:422.8M語(yǔ)言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

什么Bat 這是dos下面的批處理文件,可以批量執(zhí)行Dos命令。

下面我們來(lái)講一下bat文件中的For 語(yǔ)句的用法:


我們先來(lái)看下for的幫助在 cmd下輸入 for /? 就可以打印出來(lái)

對(duì)一組文件中的每一個(gè)文件執(zhí)行某個(gè)特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一個(gè)單一字母可替換的參數(shù)。

  (set)      指定一個(gè)或一組文件。可以使用通配符。

  command    指定對(duì)每個(gè)文件執(zhí)行的命令。

  command-parameters

             為特定命令指定參數(shù)或命令行開(kāi)關(guān)。

在批處理程序中使用 FOR 命令時(shí),指定變量請(qǐng)使用 %%variable

而不要用 %variable。變量名稱是區(qū)分大小寫(xiě)的,所以 %i 不同于 %I.

如果啟用命令擴(kuò)展,則會(huì)支持下列 FOR 命令的其他格式:

FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    檢查以 [drive:]path 為根的目錄樹(shù),指向每個(gè)目錄中的 FOR 語(yǔ)句。

    如果在 /R 后沒(méi)有指定目錄規(guī)范,則使用當(dāng)前目錄。如果集僅為一個(gè)單點(diǎn)(.)字符,

    則枚舉該目錄樹(shù)。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    該集表示以增量形式從開(kāi)始到結(jié)束的一個(gè)數(shù)字序列。因此,(1,1,5)將產(chǎn)生序列

    1 2 3 4 5,(5,-1,1)將產(chǎn)生序列(5 4 3 2 1)

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

  或者,如果有 usebackq 選項(xiàng):

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    fileset 為一個(gè)或多個(gè)文件名。繼續(xù)到 fileset 中的下一個(gè)文件之前,

    每份文件都被打開(kāi)、讀取并經(jīng)過(guò)處理。處理包括讀取文件,將其分成一行行的文字,

    然后將每行解析成零或更多的符號(hào)。然后用已找到的符號(hào)字符串變量值調(diào)用 For 循環(huán)。

    以默認(rèn)方式,/F 通過(guò)每個(gè)文件的每一行中分開(kāi)的第一個(gè)空白符號(hào)。跳過(guò)空白行。

    你可通過(guò)指定可選 "options" 參數(shù)替代默認(rèn)解析操作。這個(gè)帶引號(hào)的字符串包括一個(gè)

    或多個(gè)指定不同解析選項(xiàng)的關(guān)鍵字。這些關(guān)鍵字為:

        eol=c           - 指一個(gè)行注釋字符的結(jié)尾(就一個(gè))

        skip=n          - 指在文件開(kāi)始時(shí)忽略的行數(shù)。

        delims=xxx      - 指分隔符集。這個(gè)替換了空格和制表符的

                          默認(rèn)分隔符集。

        tokens=x,y,m-n  - 指每行的哪一個(gè)符號(hào)被傳遞到每個(gè)迭代

                          的 for 本身。這會(huì)導(dǎo)致額外變量名稱的分配。m-n

                          格式為一個(gè)范圍。通過(guò) nth 符號(hào)指定 mth。如果

                          符號(hào)字符串中的最后一個(gè)字符星號(hào),

                          那么額外的變量將在最后一個(gè)符號(hào)解析之后

                          分配并接受行的保留文本。

        usebackq        - 指定新語(yǔ)法已在下類情況中使用:

                          在作為命令執(zhí)行一個(gè)后引號(hào)的字符串并且一個(gè)單

                          引號(hào)字符為文字字符串命令并允許在 file-set

                          中使用雙引號(hào)擴(kuò)起文件名稱。

  某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    會(huì)分析 myfile.txt 中的每一行,忽略以分號(hào)打頭的那些行,將

    每行中的第二個(gè)和第三個(gè)符號(hào)傳遞給 for 函數(shù)體,用逗號(hào)和/或

    空格分隔符號(hào)。請(qǐng)注意,此 for 函數(shù)體的語(yǔ)句引用 %i 來(lái)

    獲得第二個(gè)符號(hào),引用 %j 來(lái)獲得第三個(gè)符號(hào),引用 %k

    來(lái)獲得第三個(gè)符號(hào)后的所有剩余符號(hào)。對(duì)于帶有空格的文件

    名,你需要用雙引號(hào)將文件名括起來(lái)。為了用這種方式來(lái)使

    用雙引號(hào),還需要使用 usebackq 選項(xiàng),否則,雙引號(hào)會(huì)

    被理解成是用作定義某個(gè)要分析的字符串的。

    %i 在 for 語(yǔ)句中顯式聲明,%j 和 %k 是通過(guò)

    tokens= 選項(xiàng)隱式聲明的?梢酝ㄟ^(guò) tokens= 一行

    指定最多 26 個(gè)符號(hào),只要不試圖聲明一個(gè)高于字母 "z" 或

    "Z" 的變量。請(qǐng)記住,F(xiàn)OR 變量是單一字母、分大小寫(xiě)和全局的變量;

    而且,不能同時(shí)使用超過(guò) 52 個(gè)。

    還可以在相鄰字符串上使用 FOR /F 分析邏輯,方法是,

    用單引號(hào)將括號(hào)之間的 file-set 括起來(lái)。這樣,該字符

    串會(huì)被當(dāng)作一個(gè)文件中的一個(gè)單一輸入行進(jìn)行解析。

    最后,可以用 FOR /F 命令來(lái)分析命令的輸出。方法是,將

    括號(hào)之間的 file-set 變成一個(gè)反括字符串。該字符串會(huì)

    被當(dāng)作命令行,傳遞到一個(gè)子 CMD.EXE,其輸出會(huì)被捕獲到

    內(nèi)存中,并被當(dāng)作文件分析。如以下例子所示:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    會(huì)枚舉當(dāng)前環(huán)境中的環(huán)境變量名稱。

另外,F(xiàn)OR 變量參照的替換已被增強(qiáng)。你現(xiàn)在可以使用下列

選項(xiàng)語(yǔ)法:

     %~I          - 刪除任何引號(hào)("),擴(kuò)展 %I

     %~fI        - 將 %I 擴(kuò)展到一個(gè)完全合格的路徑名

     %~dI        - 僅將 %I 擴(kuò)展到一個(gè)驅(qū)動(dòng)器號(hào)

     %~pI        - 僅將 %I 擴(kuò)展到一個(gè)路徑

     %~nI        - 僅將 %I 擴(kuò)展到一個(gè)文件名

     %~xI        - 僅將 %I 擴(kuò)展到一個(gè)文件擴(kuò)展名

     %~sI        - 擴(kuò)展的路徑只含有短名

     %~aI        - 將 %I 擴(kuò)展到文件的文件屬性

     %~tI        - 將 %I 擴(kuò)展到文件的日期/時(shí)間

     %~zI        - 將 %I 擴(kuò)展到文件的大小

     %~$PATH:I   - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)展

                   到找到的第一個(gè)完全合格的名稱。如果環(huán)境變量名

                   未被定義,或者沒(méi)有找到文件,此組合鍵會(huì)擴(kuò)展到

                   空字符串

可以組合修飾符來(lái)得到多重結(jié)果:

     %~dpI       - 僅將 %I 擴(kuò)展到一個(gè)驅(qū)動(dòng)器號(hào)和路徑

     %~nxI       - 僅將 %I 擴(kuò)展到一個(gè)文件名和擴(kuò)展名

     %~fsI       - 僅將 %I 擴(kuò)展到一個(gè)帶有短名的完整路徑名

     %~dp$PATH:I - 搜索列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)展

                   到找到的第一個(gè)驅(qū)動(dòng)器號(hào)和路徑。

     %~ftzaI     - 將 %I 擴(kuò)展到類似輸出線路的 DIR

在以上例子中,%I 和 PATH 可用其他有效數(shù)值代替。%~ 語(yǔ)法

用一個(gè)有效的 FOR 變量名終止。選取類似 %I 的大寫(xiě)變量名

比較易讀,而且避免與不分大小寫(xiě)的組合鍵混淆。

上面是官方的解釋下面針對(duì)具體的實(shí)列來(lái)說(shuō)明

注意 直接在 cmd窗口中運(yùn)行 for 是不行的,你要把文件保存為 .bat 雙擊來(lái)執(zhí)行


1.沒(méi)有任何參數(shù)的for格式為: for %%i in (set) do command

%%i 為變量set為一個(gè)文件或者一組文件,其實(shí)就是一個(gè)集合?捎猛ㄅ浞,比如*.txt。

command 是要執(zhí)行的命令。

看個(gè)例子:

有個(gè)文件夾,有如下文件:
a.txt
b.mp3
c.mp3
c.wma
a.rm
e.bat

你想顯示里面的擴(kuò)展名為mp3的文件,你會(huì)用什么命令呢?當(dāng)然是dir了,dir *.mp3。

同樣的,for也可以來(lái)實(shí)現(xiàn),如下:for %%i in (*.mp3) do echo %%i

這如何理解?for會(huì)先從括號(hào)里面執(zhí)行,因?yàn)槔ㄌ?hào)里面是*.mp3,所以for會(huì)先得到當(dāng)前目錄下所有的擴(kuò)展名是mp3的文件,并把它們作為一個(gè)集合,而每個(gè)文件名就是一個(gè)元素,像這樣{b.mp3,c.mp3},然后用%%i依次代替每個(gè)元素,之后做do后面的命令。

具體過(guò)程如下:

用%%i代替b.mp3,然后執(zhí)行echo %%i,顯示b.mp3

用%%i代替c.mp3,再執(zhí)行echo %%i,顯示c.mp3

沒(méi)有元素了,for就停止了。

當(dāng)然,()里面不局限于一個(gè)文件或者通配符,可以有多個(gè),比如:for %%i in (*.mp3,*.wma) do echo %%i   也是可以的。

注意:do 后面可以跟任何命令,不要局限于echo,這里只是演示。

2. 含有/L的for格式為:for /L %%i in (start,step,end) do command

這個(gè)表示以增量形式從start到end的一個(gè)數(shù)字序列,步長(zhǎng)是step,就是每次的增量是step

比如:(1,1,5) 將產(chǎn)生序列 1 2 3 4 5,(1,2,9) 將產(chǎn)生1 3 5 7 9序列。

這有什么用呢?

舉個(gè)例子,你想同時(shí)打開(kāi)3個(gè)記事本程序,可以這樣:for /L %%i in (1,1,3) do notpad.exe

如何理解?

還是從括號(hào)先執(zhí)行,產(chǎn)生集合{1,2,3},然后用%%i依次代替集合中的每個(gè)元素,之后執(zhí)行do后面的命令。

當(dāng)然這里每次%%i替換集合里面的元素是沒(méi)有意義的,因?yàn)槲覀儾](méi)有在do后面的命令中用到%%i,但是你不能阻止%%i代替每個(gè)元素。

因?yàn)橛?個(gè)元素,所以do后面的命令執(zhí)行3次就停止了。

再舉一個(gè)例子,加入你要顯示1到20之間的奇數(shù),怎么辦,可以如下:for /L %%i in (1,2,20) do echo %%i

同樣是先產(chǎn)生集合{1,3,5,7,9,11,13,15,17,19},然后用%%i依次代替每個(gè)元素,之后執(zhí)行do后面的echo %%i

這個(gè)例子就體現(xiàn)出變量%%i會(huì)始終代替集合中的每個(gè)元素。

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

這個(gè)可能是最常用的,也是最強(qiáng)的命令,主要用來(lái)處理文件和一些命令的輸出結(jié)果。

file代表一個(gè)或多個(gè)文件

string 代表字符串

command代表命令

["options"] 可選

對(duì)于FOR /F %%i IN (file) DO command

file為文件名,按照官方的說(shuō)法是,for會(huì)依次將file中的文件打開(kāi),并且在進(jìn)行到下一個(gè)文件之前將每個(gè)文件讀取到內(nèi)存,按照每一行分成一個(gè)一個(gè)的元素,忽略空白的行,看個(gè)例子。

假如文件a.txt中有如下內(nèi)容:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

你想顯示a.txt中的內(nèi)容,會(huì)用什么命令呢?當(dāng)然是type,type a.txtfor也可以完成同樣的命令:for /f %%i in (a.txt) do echo %%i

還是先從括號(hào)執(zhí)行,因?yàn)楹袇?shù)/f,所以for會(huì)先打開(kāi)a.txt,然后讀出a.txt里面的所有內(nèi)容,把它作為一個(gè)集合,并且以每一行作為一個(gè)元素,所以會(huì)產(chǎn)生這樣的集合,

{“第1行第1列 第1行第2列 第1行第3列”, rem 第一個(gè)元素“第2行第1列 第2行第2列 第2行第3列”, rem 第二個(gè)元素“第3行第1列 第3行第2列 第3行第3列”}   rem 第三個(gè)元素集合中只有3個(gè)元素,同樣用%%i依次代替每個(gè)元素,然后執(zhí)行do后面的命令。

具體過(guò)程:

用%%i代替“第1行第1列 第1行第2列 第1行第3列”,執(zhí)行do后面的echo %%i,顯示“第1行第1列 第1行第2列 第1行第3列”,

用%%i代替“第2行第1列 第2行第2列 第2行第3列”,執(zhí)行echo %%i,顯示“第2行第1列 第2行第2列 第2行第3列”,

依次,直到每個(gè)元素都代替完為止。

為了加強(qiáng)理解/f的作用,請(qǐng)執(zhí)行一下兩個(gè)命令,對(duì)比即可明白:for /f %%i in (a.txt) do echo %%i rem 這個(gè)會(huì)顯示a.txt里面的內(nèi)容,因?yàn)?f的作用,會(huì)讀出a.txt中 的內(nèi)容。for %%i in (a.txt) do echo %%i rem 而這個(gè)只會(huì)顯示a.txt這個(gè)名字,并不會(huì)讀取其中的內(nèi)容。通過(guò)上面的學(xué)習(xí),我們發(fā)現(xiàn)for /f會(huì)默認(rèn)以每一行來(lái)作為一個(gè)元素,但是如果我們還想把每一行再分解更小的內(nèi)容,該怎么辦呢?不用擔(dān)心,for命令還為我們提供了更詳細(xì)的參數(shù),使我們將每一行分為更小的元素成為可能。

它們就是:delims和tokens

delims 用來(lái)告訴for每一行應(yīng)該拿什么作為分隔符,默認(rèn)的分隔符是空格和tab鍵

比如,還是上面的文件,我們執(zhí)行下面的命令:for /f "delims= " %%i in (a.txt) do echo %%i

顯示的結(jié)果是:

第1行第1列
第2行第1列
第3行第1列

為什么是這樣的呢。因?yàn)檫@里有了delims這個(gè)參數(shù),=后面有一個(gè)空格,意思是再將每個(gè)元素以空格分割,默認(rèn)是只取分割之后的第一個(gè)元素。

執(zhí)行過(guò)程是:

將第一個(gè)元素“第1行第1列 第1行第2列 第1行第3列”分成三個(gè)元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默認(rèn)只取第一個(gè),即“第1行第1列”,然后執(zhí)行do后面的命令,依次類推。

但是這樣還是有局限的,如果我們想要每一行的第二列元素,那又如何呢?

這時(shí)候,tokens跳出來(lái)說(shuō),我能做到。

它的作用就是當(dāng)你通過(guò)delims將每一行分為更小的元素時(shí),由它來(lái)控制要取哪一個(gè)或哪幾個(gè)。

還是上面的例子,執(zhí)行如下命令:for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i

執(zhí)行結(jié)果:

第1行第2列
第2行第2列
第3行第2列

如果要顯示第三列,那就換成tokens=3。

同時(shí)tokens支持通配符*,以及限定范圍。

如果要顯示第二列和第三列,則換成tokens=2,3或tokens=2-3,如果還有更多的則為:tokens=2-10之類的。

此時(shí)的命令為:for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

怎么多出一個(gè)%%j?

這是因?yàn)槟愕膖okens后面要取每一行的兩列,用%%i來(lái)替換第二列,用%%j來(lái)替換第三列。

并且必須是按照英文字母順序排列的,%%j不能換成%%k,因?yàn)閕后面是j

執(zhí)行結(jié)果為:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

對(duì)以通配符*,就是把這一行全部或者這一行的剩余部分當(dāng)作一個(gè)元素了。

比如:for /f "tokens=* delims= " %%i in (a.txt) do echo %%i

執(zhí)行結(jié)果為:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其實(shí)就跟for /f %%i in (a.txt) do echo %%i的執(zhí)行結(jié)果是一樣的。

再如:for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

執(zhí)行結(jié)果為:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩余的所有

最后還有skip合eol,這倆個(gè)簡(jiǎn)單,skip就是要忽略文件的前多少行,而eol用來(lái)指定當(dāng)一行以什么符號(hào)開(kāi)始時(shí),就忽略它。

比如:for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

結(jié)果為:

第3行第1列 第3行第2列 第3行第3列

用skip來(lái)告訴for跳過(guò)前兩行。

如果不加tokens=*的話,執(zhí)行結(jié)果為:

第3行第1列

不知道怎么回事。

再如,當(dāng)a.txt內(nèi)容變成:

.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

執(zhí)行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i結(jié)果是:

第3行第1列 第3行第2列 第3行第3列

用eol來(lái)告訴for忽略以“.”開(kāi)頭的行。

同樣也必須加tokens=*,否則只會(huì)顯示“第3行第1列”,還是不知道怎么回事。

好了,關(guān)于for的/f參數(shù)中的file就先說(shuō)到這,有時(shí)間再寫(xiě)其他的,如果有什么疑問(wèn),可以留言交流。

for 詳細(xì)的講解

for 語(yǔ)句的基本用法 :

    最復(fù)雜的for 語(yǔ)句,也有其基本形態(tài),它的模樣是這樣的: 

   在cmd 窗口中:for %I in (command1) do command2 

   在批處理文件中:for %%I in (command1) do command2 

   之所以要區(qū)分 cmd 窗口和批處理文件兩種環(huán)境,是因?yàn)樵谶@兩種環(huán)境下,命令語(yǔ)句表現(xiàn)出來(lái)的行為雖然基本一樣,但是在細(xì)節(jié)上還是稍有不同,最明顯的一個(gè)差異就是:在cmd 窗口中,for 之后的形式變量I 必須使用單百分號(hào)引用,即%I;而在批處理文件中,引用形式變量I 必須使用雙百分號(hào),即%%I。為了方便起見(jiàn),若不是特別強(qiáng)調(diào),以下的講解都以批處理文件環(huán)境為例。 

   我們先來(lái)看一下for 語(yǔ)句的基本要素都有些什么: 

   1、for、in 和do 是  for 語(yǔ)句的關(guān)鍵字,它們?nèi)齻(gè)缺一不可; 

   2、%%I 是for 語(yǔ)句中對(duì)形式變量的引用,就算它在do 后的語(yǔ)句中沒(méi)有參與語(yǔ)句的執(zhí)行,也是必須出現(xiàn)的; 

   3、in 之后,do 之前的括號(hào)不能省略; 

   4、command1 表示字符串或變量,command2 表示字符串、變量或命令語(yǔ)句; 

   5、for /d  注意:for 后 可以 加 /f /r /l /d 這四個(gè) 參數(shù),現(xiàn)在 先 介紹 /d 參數(shù)的 作用,一句話 /d 用于 搜索 目錄 或 文件夾,但 不會(huì)搜索文件,也不搜索 子目錄;

   現(xiàn)在,你可能已經(jīng)會(huì)寫(xiě)一個(gè)簡(jiǎn)單的for 語(yǔ)句了,比如: 

在 一個(gè) cmd.bat 文件里 寫(xiě),寫(xiě) 如下 兩條 命令:

for /d %%i in (*) do echo %%i
pause 

@echo off 

for %%I in (bbs.bathome.cn) do echo %%I 

pause 

   保存為批處理文件并執(zhí)行,將會(huì)在彈出的批處理窗口中看到這樣的信息: 

[result1] 

bbs.bathome.cn 

請(qǐng)按任意鍵繼續(xù)... 

  先來(lái)分析一下 for 語(yǔ)句的一些注意事項(xiàng),之后,再讓大家看看更為強(qiáng)大的for 語(yǔ)句實(shí)例。 

   1、for 語(yǔ)句的形式變量 I,可以換成 26 個(gè)字母中的任意一個(gè),這些字母會(huì)區(qū)分大小寫(xiě),也就是說(shuō),%%I 和%%i 會(huì)被認(rèn)為不是同一個(gè)變量;形式變量 I還可以換成其他的字符,但是,為了不與批處理中的%0~%9 這10 個(gè)形式變量發(fā)生沖突,請(qǐng)不要隨意把%%I 替換為%%0  ~%%9 中的任意一個(gè);

   2、in 和do 之間的command1 表示的字符串或變量可以是一個(gè),也可以是多個(gè),每一個(gè)字符串或變量,我們稱之為一個(gè)元素,每個(gè)元素之間,用空格鍵、跳格鍵、逗號(hào)、分號(hào)或等號(hào)分隔;

   3、for 語(yǔ)句依次提取 command1 中的每一個(gè)元素,把它的值賦予形式變量I,帶到do 后的command2 中參與命令的執(zhí)行;并且每次只提取一個(gè)元素,然后執(zhí)行一次 do 后的命令語(yǔ)句,而無(wú)論這個(gè)元素是否被帶到 command2 中參與了command2 的運(yùn)行;當(dāng)執(zhí)行完一次do 后的語(yǔ)句之后,再提取command1 中的下一個(gè)元素,再執(zhí)行一次 command2,如此循環(huán),直到 command1 中的所有元素都已經(jīng)被提取完畢,該for 語(yǔ)句才宣告執(zhí)行結(jié)束; 

   其中,第3 點(diǎn)是最為關(guān)鍵的,它描述了for 語(yǔ)句的執(zhí)行過(guò)程,是for 語(yǔ)句的精髓所在,大家一定要牢記這一條,才能深刻理解更為復(fù)雜的for 流程。 

   有了以上的基礎(chǔ),我們?cè)賮?lái)看一個(gè)例子,這個(gè)例子修改了code1 的部分內(nèi)容,

結(jié)果將大不一樣: 

@echo off 

for %%I in (bbs,bathome,cn) do echo %%I 

pause 

   和code1 的執(zhí)行結(jié)果相比,code2 的執(zhí)行結(jié)果發(fā)生了如下變化: 

   1、顯示結(jié)果分成了3 行(不算最后一行中文提示); 

   2、每一行都從逗號(hào)處被切分; 

   如果把  bbs.bathome.cn  這個(gè)字符串中的點(diǎn)號(hào)換為 空格、跳格 或 等號(hào),執(zhí)行結(jié)果將和code2 的執(zhí)行結(jié)果別無(wú)二致。 

以下這段代碼的 功能是 :檢測(cè)當(dāng)前硬盤(pán)都有哪些分區(qū)

@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  當(dāng)前硬盤(pán)的分區(qū)有: 

for %%i in (%str%) do if exist %%i: echo %%i: 

pause 

   這段代碼能檢測(cè)硬盤(pán)都有哪些分區(qū),包括 U 盤(pán)和移動(dòng)硬盤(pán)的分區(qū),但是,

當(dāng)光驅(qū)中有盤(pán)的時(shí)候,也會(huì)被列出來(lái),這是本代碼的一個(gè)缺憾,在以后的講解中,

我將向大家講述如何消除這個(gè)瑕疵,敬請(qǐng)關(guān)注本系列的后續(xù)章節(jié)。 

   想知道當(dāng)前目錄下都有哪些文件,請(qǐng)用下面的代碼: 

@echo off 

for %%i in (*.*) do echo "%%i" 

pause 

 第二句 可以 用 for %%i in (*) do echo "%%i"  代替;

   想列出當(dāng)前目錄下所有的文本文件嗎?請(qǐng)用下面的代碼: 

@echo off 

for %%i in (*.txt) do echo "%%i" 

pause 

   想列出只用兩個(gè)字符作為文件名的文本文件嗎?請(qǐng)用下面的代碼: 

@echo off 

for %%i in (??.txt) do echo "%%i" 

pause 

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

   題外話: 

   1、列出當(dāng)前目錄下各種文件的方法,最簡(jiǎn)單的還是用dir 命令,但是,從以上代碼中,各位可以加深對(duì)for 語(yǔ)句執(zhí)行流程的理解(用到了通配符*和?); 

   2、注意:以上代碼不能列出含有隱藏或系統(tǒng)屬性的文件; 

-----------------------------------------

    三、文本解析顯神威:for /f  用法詳解 

    前言 

   for /f  是個(gè)十分強(qiáng)大的家伙。 

   如果說(shuō),for 語(yǔ)句是批處理中最強(qiáng)大的語(yǔ)句的話,那么,for /f  就是精華中的精華。 

   for  /f  的強(qiáng)大,和它擁有眾多的開(kāi)關(guān)密切相關(guān)。因?yàn)殚_(kāi)關(guān)眾多,所以用法復(fù)雜,本章將分成若干小節(jié),為大家逐一介紹強(qiáng)大的  for /f  語(yǔ)句。 

    (一)  為解析文本而生:f or /f  的基本用法 

   所有的對(duì)象,無(wú)論是文件、窗體、還是控件,在所有的非機(jī)器語(yǔ)言看來(lái),無(wú)外乎都是形如"c:\test.txt"、"CWnd"之類的文本信息;而所有的對(duì)象,具體的如ini

文件中的某條配置信息、注冊(cè)表中的某個(gè)鍵值、數(shù)據(jù)庫(kù)中的某條記錄„„都只有轉(zhuǎn)化為具有一定格式的文本信息,方可被代碼識(shí)別、操控?梢哉f(shuō),編程的很大

一部分工作,都是在絞盡腦汁想方設(shè)法如何提取這些文本信息。 

   而提取文本信息,則是for /f 的拿手好戲:讀取文件內(nèi)容;提取某幾行字符;截取某個(gè)字符片段;對(duì)提取到的內(nèi)容再切分、打亂、雜糅„„只要你所能想到的花樣,for /f  都會(huì)想方設(shè)法幫你辦到,因?yàn),for /f  就是被設(shè)計(jì)成專門(mén)用于解析文本的。 

   先來(lái)看個(gè)例子。 

   假如有個(gè)文本文件test.txt,內(nèi)容如下: 

[txt1] 

論壇的目標(biāo)是:不求最大,但求最好,做最實(shí)用的批處理論壇。 

論壇地址:bbs.bathome.cn。 

這里是:新手晉級(jí)的福地,高手論劍的天堂。 

   那么,將如下代碼保存為test.cmd,并放在test.txt 同一目錄下運(yùn)行,將會(huì)在屏幕上原樣顯示test.txt 的內(nèi)容: 

@echo off 

for /f %%i in (test.txt) do echo %%i 

pause 

   這段代碼,主要是讓你樹(shù)立這樣一種觀念:讀取文本文件的內(nèi)容,請(qǐng)使用  for /f  語(yǔ)句! 

   進(jìn)階話題:for /f  語(yǔ)句是把整個(gè)test.txt 一次性顯示出來(lái)的? 

   在這段代碼中,雖然執(zhí)行結(jié)果是把 test.txt 中的所有內(nèi)容都顯示出來(lái)了,貌似  for /f  語(yǔ)句是把整個(gè)test.txt 一次性顯示到屏幕上,實(shí)際上并非如此。 

   無(wú)論for 語(yǔ)句做何種變化,它的執(zhí)行過(guò)程仍然遵循基本的for 流程:依次處理每個(gè)元素,直到所有的元素都被處理為止。只不過(guò)在for /f 語(yǔ)句中,這里的元素是指文件中的每一行,也就是說(shuō),for /f  語(yǔ)句是以行為單位處理文本文件的。這是一條極為重要的規(guī)則,在上一章中也強(qiáng)調(diào)過(guò)它的重要性,希望在接下來(lái)的學(xué)習(xí)過(guò)程中,你能時(shí)刻牢記這一原則,那么,很多問(wèn)題將會(huì)迎刃而解。以下是驗(yàn)證這一說(shuō)法的演示代碼(在[code4]的基礎(chǔ)上添加了&pause 語(yǔ)句): 

@echo off 

for /f %%i in (test.txt) do echo %%i&pause 

pause 

    (二)  切分字符串的利器:delims= 

   也許你對(duì)[code4]這段代碼不屑一顧:不就是把test.txt 的內(nèi)容顯示出來(lái)了么?

好像用處不大啊。 

   好吧,我們來(lái)玩?zhèn)魔術(shù)。 

   還是[txt1]這段文本,把[code4]改造一下: 

[code6] 

@echo off 

for /f "delims=," %%i in (test.txt) do echo %%i 

pause 

   再次運(yùn)行test.cmd,看到什么變化了嗎?! 

論壇的目標(biāo)是:不求最大 

論壇地址:bbs.bathome.cn。 

這里是:新手晉級(jí)的福地 

請(qǐng)按任意鍵繼續(xù)... 

   結(jié)果,你驚奇地發(fā)現(xiàn),每行第一個(gè)逗號(hào)之后的所有內(nèi)容都不見(jiàn)了(如果有不存在逗號(hào)的行,則保留原樣),也就說(shuō),你成功地提取到了每行第一個(gè)逗號(hào)之前的所有內(nèi)容! 

   試想一下,這段代碼會(huì)有什么用呢? 

   如果別人給了你一個(gè)軟件清單,每行都是"英文軟件名(逗號(hào))中文軟件名"的格式,而你卻只想保留英文名的時(shí)候,這段代碼將是多么有用!再假設(shè),有這么一個(gè)IP 文件,第一列是數(shù)字格式的IP 地址,第二列是具體的空間地址,列與列之間用逗號(hào)分隔,而你想提取其中數(shù)字格式的 IP,呵呵,我不說(shuō)你也知道該怎么辦了吧? 

   要是文本內(nèi)容不是以逗號(hào)分隔,而是以其他符號(hào)分隔,那么,把"delims=,"的逗號(hào)換成相應(yīng)的符號(hào)就可以了。 

   在這里,我們引入了一個(gè)新的開(kāi)關(guān):"delims=,",它的含義是:以逗號(hào)作為被處理的字符串的分隔符號(hào)。 

   在批處理中,指定分隔符號(hào)的方法是:添加一個(gè)形如  "delims=符號(hào)列表"  的開(kāi)關(guān),這樣,被處理的每行字符串都會(huì)被符號(hào)列表中羅列出來(lái)的符號(hào)切分開(kāi)來(lái)。 

   需要注意的是:如果沒(méi)有指定"delims=符號(hào)列表"這個(gè)開(kāi)關(guān),那么,for /f  語(yǔ)句默認(rèn)以空格鍵或跳格鍵作為分隔符號(hào)。請(qǐng)把[txt1]中不同位置上的標(biāo)點(diǎn)符號(hào)改為空格或跳格,再運(yùn)行[code4]試試。 

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

   進(jìn)階話題:如果我要指定的符號(hào)不止一個(gè),該怎么辦? 

   在上面的講解中,我提到了指定分隔符號(hào)的方法:添加一個(gè)形如"delims=符

號(hào)列表"的開(kāi)關(guān)。不知道你注意到?jīng)]有,我的說(shuō)法是"符號(hào)列表"而非"符號(hào)",這是

大有講究的,因?yàn),你可以一次性指定多個(gè)分隔符號(hào)! 

   還是以[txt1]為例,把[code6]再改造一下: 

@echo off 

for /f "delims=.," %%i in (test.txt) do echo %%i 

pause 

   結(jié)果顯示: 

[result3] 

論壇的目標(biāo)是:不求最大 

論壇地址:bbs 

這里是:新手晉級(jí)的福地 

請(qǐng)按任意鍵繼續(xù)... 

   這樣,第一個(gè)點(diǎn)號(hào)或第一個(gè)逗號(hào)之前的內(nèi)容都被提取出來(lái)了。 

   [code7]的執(zhí)行過(guò)程是:逐行讀取 test.txt 中的內(nèi)容,以點(diǎn)號(hào)和逗號(hào)切分每一

行的內(nèi)容(不存在點(diǎn)號(hào)和逗號(hào)的行,則不再切分,為了描述的方便,我們把被點(diǎn)

號(hào)或逗號(hào)切分的一個(gè)一個(gè)的字符串片段,稱之為節(jié)),然后,for /f  會(huì)提取第一節(jié)

的內(nèi)容作為最終結(jié)果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串

被切分成了兩個(gè)以上的節(jié),但是,[code7]的代碼只會(huì)提取第一節(jié)字符串的內(nèi)容,

因?yàn)? for /f  語(yǔ)句默認(rèn)只提取第一節(jié)的符串。 

    (三)  定點(diǎn)提取:tokens= 

   上一節(jié)在講解  delims=  的時(shí)候,我一再?gòu)?qiáng)調(diào)  for  /f  默認(rèn)只能提取到第一節(jié)

的內(nèi)容,現(xiàn)在我們來(lái)思考一個(gè)問(wèn)題:如果我要提取的內(nèi)容不在第一節(jié)上,那怎么

辦? 

   這回,就該輪到  tokens=  出馬了。 

   tokens=  后面一般跟的是數(shù)字,如  tokens=2,也可以跟多個(gè),但是每個(gè)數(shù)字

之間用逗號(hào)分隔,如  tokens=3,5,8,它們的含義分別是:提取第2 節(jié)字符串、提

取第3、第5 和第8 節(jié)字符串。注意,這里所說(shuō)的“節(jié)”,是由  delims=  這一開(kāi)

關(guān)劃分的,它的內(nèi)容并不是一成不變的。 

   下面來(lái)看一個(gè)例子: 

尺有所短,寸有所長(zhǎng),學(xué)好批處理沒(méi)商量,考慮問(wèn)題復(fù)雜化,解決問(wèn)題簡(jiǎn)潔化。 

   對(duì)[txt2]這段文本,假設(shè)它們保存在文件 test.txt 中,如果我想提取“學(xué)好批

處理沒(méi)商量”這句話,該如何寫(xiě)代碼呢? 

   我們稍微觀察一下[txt2]就會(huì)發(fā)現(xiàn),如果以逗號(hào)作為切分符號(hào),就正好可以

把“學(xué)好批處理沒(méi)商量”化為單獨(dú)的一“節(jié)”,結(jié)合上一節(jié)的講解,我們知道,

"delims=,"  這個(gè)開(kāi)關(guān)是不可缺少的,而要提取的內(nèi)容在以逗號(hào)切分的第3 節(jié)上,

那么,tokens=  后面的數(shù)字就應(yīng)該是3 了,最終的代碼如下: 

@echo off 

for /f "delims=,  tokens=3" %%i in (test.txt) do echo %%i 

pause 

   如果我們現(xiàn)在要提取的不只一個(gè)“節(jié)”,而是多個(gè),那又怎么辦呢?比如,

要提取以逗號(hào)切分的第2 節(jié)和第5 節(jié)字符串,是寫(xiě)成這樣嗎? 

[code9] 

@echo off 

for /f "delims=,  tokens=2,5" %%i in (test.txt) do echo %%i 

pause 

   運(yùn)行批處理后發(fā)現(xiàn),執(zhí)行結(jié)果只顯示了第2 節(jié)的內(nèi)容。 

   原來(lái),echo  后面的  %%i  只接收到了  tokens=2,5  中第一個(gè)數(shù)值2 所代表的

那個(gè)字符串,而第二個(gè)數(shù)值5 所代表的字符串因?yàn)闆](méi)有變量來(lái)接收,所以就無(wú)法

在執(zhí)行結(jié)果中顯示出來(lái)了。 

   那么,要如何接收  tokens=  后面多個(gè)數(shù)值所指代的內(nèi)容呢? 

   for /f  語(yǔ)句對(duì)這種情況做如下規(guī)定: 

   如果  tokens=  后面指定了多個(gè)數(shù)字,如果形式變量為%%i,那么,第一個(gè)

數(shù)字指代的內(nèi)容用第一個(gè)形式變量%%i 來(lái)接收,第二個(gè)數(shù)字指代的內(nèi)容用第二

個(gè)形式變量%%j 來(lái)接收,第三個(gè)數(shù)字指代的內(nèi)容用第三個(gè)形式變量%%k 來(lái)接

收„„第N 個(gè)數(shù)字指代的內(nèi)容用第N 個(gè)形式變量來(lái)接收,其中,形式變量遵循

字母的排序,第 N 個(gè)形式變量具體是什么符號(hào),由第一個(gè)形式變量來(lái)決定:如

果第一個(gè)形式變量是%%i,那么,第二個(gè)形式變量就是%%j;如果第一個(gè)形式

變量用的是%%x,那么,第二個(gè)形式變量就是%%y。 

   現(xiàn)在回頭去看[code9],你應(yīng)該知道如何修改才能滿足題目的要求了吧?修改

結(jié)果如下: 

@echo off 

for /f "delims=,  tokens=2,5" %%i in (test.txt) do echo %%i %%j 

pause 

   如果有這樣一個(gè)要求:顯示[txt2]中的內(nèi)容,但是逗號(hào)要替換成空格,如何

編寫(xiě)代碼? 

   結(jié)合上面所學(xué)的內(nèi)容,稍加思索,你可能很快就得出了答案: 

@echo off 

for  /f  "delims= ,   tokens=1,2,3,4,5"  %%i  in  (test.txt)  do 

echo %%i %%j %%k %%l %%m 

pause 

   寫(xiě)完之后,你可能意識(shí)到這樣一個(gè)問(wèn)題:假如要提取的“節(jié)”數(shù)不是5,而

是10,或者20,或者更多,難道我也得從1 寫(xiě)到10、20 或者更多嗎?有沒(méi)有更

簡(jiǎn)潔的寫(xiě)法呢? 

   答案是有的,那就是:如果要提取的內(nèi)容是連續(xù)的多“節(jié)”的話,那么,連

續(xù)的數(shù)字可以只寫(xiě)最小值和最大值,中間用短橫連接起來(lái)即可,比如 

tokens=1,2,3,4,5  可以簡(jiǎn)寫(xiě)為  tokens=1-5  。 

   還可以把這個(gè)表達(dá)式寫(xiě)得更復(fù)雜一點(diǎn):tokens=1,2-5 ,tokens=1-3,4,5 ,

tokens=1-4,5„„怎么方便就怎么寫(xiě)吧。 

   大家可能還看到一種比較怪異的寫(xiě)法: 

@echo off 

for /f "delims=,  tokens=1,*" %%i in (test.txt) do echo %%i %%j 

pause 

   結(jié)果,第一個(gè)逗號(hào)不見(jiàn)了,取代它的是一個(gè)空格符號(hào),其余部分保持不變。 

   其中奧妙就在這個(gè)星號(hào)上面。 

    tokens=后面所接的星號(hào)具備這樣的功能:字符串從左往右被切分成緊跟在*

之前的數(shù)值所表示的節(jié)數(shù)之后,字符串的其余部分保持不變,整體被*所表示的

一個(gè)變量接收。 

   理論講解是比較枯燥的,特別是為了嚴(yán)密起見(jiàn),還使用了很多限定性的修飾

詞,導(dǎo)致句子很長(zhǎng),增加了理解的難度,我們還是結(jié)合[code12]來(lái)講解一下吧。 

   [txt2]  的內(nèi)容被切分,切分符號(hào)為逗號(hào),當(dāng)切分完第一節(jié)之后,切分動(dòng)作不

再繼續(xù)下去,因?yàn)? tokens=1,*  中,星號(hào)前面緊跟的是數(shù)字 1;第一節(jié)字符串被

切分完之后,其余部分字符串不做任何切分,整體作為第二節(jié)字符串,這樣,[txt2]

就被切分成了兩節(jié),分別被變量%%i 和變量%%j 接收。 

   以上幾種切分方式可以結(jié)合在一起使用。不知道下面這段代碼的含義你是否

看得懂,如果看不懂的話,那就運(yùn)行一下代碼,然后反復(fù)揣摩,你一定會(huì)更加深

刻地理解本節(jié)所講解的內(nèi)容的: 

[code13] 

@echo off 

for /f "delims=,  tokens=1,3-4,*" %%i in (test.txt) do echo %%i %%j %%k %%l 

pause 

    (四)  跳過(guò)無(wú)關(guān)內(nèi)容,直奔主題:skip=n 

   很多時(shí)候,有用的信息并不是貫穿文本內(nèi)容的始終,而是位于第 N 行之后

的行內(nèi),為了提高文本處理的效率,或者不受多余信息的干擾,for  /f  允許你跳

過(guò)這些無(wú)用的行,直接從第N+1 行開(kāi)始處理,這個(gè)時(shí)候,就需要使用參數(shù)  skip=n,

其中,n 是一個(gè)正整數(shù),表示要跳過(guò)的行數(shù)。例如: 

[code14] 

@echo off 

for /f "skip=2" %%i in (test.txt) do echo %%i 

pause 

   這段代碼將跳過(guò)頭兩行內(nèi)容,從第3 行起顯示test.txt 中的信息。 

    (五)  忽略以指定字符打頭的行:eol= 

   在cmd 窗口中敲入:for /?,相關(guān)的解釋為: 

[quote] 

eol=c                      -  指一個(gè)行注釋字符的結(jié)尾(就一個(gè)) 

[/quote] 

[quote] 

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 

     會(huì)分析  myfile.txt  中的每一行,忽略以分號(hào)打頭的那些行„„ 

[/quote] 

   第一條解釋狗屁不通,頗為費(fèi)解:行注釋字符的結(jié)尾是什么意思?“(就一

個(gè))”怎么回事?結(jié)合第二條解釋,才知道eol 有忽略指定行的功能。但是,這兩

條解釋是互相矛盾的:到底是忽略以指定字符打頭的行,還是忽略以指定字符結(jié)

尾的行? 

   實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),還是用代碼來(lái)檢驗(yàn)一下eol 的作用吧: 

[code15] 

@echo off 

for /f "eol=;" %%i in (test.txt) do echo %%i 

pause 

   結(jié)果,那些以分號(hào)打頭的行沒(méi)有顯示出來(lái)。 

   由此可見(jiàn),第二條解釋是正確的,eol=  的準(zhǔn)確含義是:忽略以指定字符打

頭的行。而第一條的“結(jié)尾”純屬微軟在信口開(kāi)河。 

   那么,“(就一個(gè))”又作何解釋呢? 

   試試這個(gè)代碼: 

[code16] 

@echo off 

for /f "eol=,;" %%i in (test.txt) do echo %%i 

pause 

   此時(shí),屏幕上出現(xiàn)  此時(shí)不應(yīng)有  ;"。  的報(bào)錯(cuò)信息?梢(jiàn),在指定字符的時(shí)

候,只能指定1 個(gè)——在很多時(shí)候,我對(duì)這樣的設(shè)計(jì)頗有微詞而又無(wú)可奈何:為

什么只能指定1 個(gè)而不是多個(gè)?要忽略多個(gè)還得又是 if 又是 findstr 加管道來(lái)多

次過(guò)濾,那效率實(shí)在太低下了——能用到的功能基本上都提供,但是卻又做不到

更好,批處理,你的功能為什么那么弱? 

   不知道大家注意到?jīng)]有,如果 test.txt 中有以分號(hào)打頭的行,那么,這些行

在代碼[code14]的執(zhí)行結(jié)果中將憑空消失。 

   原來(lái),for /f  語(yǔ)句是默認(rèn)忽略以分號(hào)打頭的行內(nèi)容的,正如它默認(rèn)以空格鍵

或跳格鍵作為字符串的切分字符一樣。 

   很多時(shí)候,我們可以充分利用這個(gè)特點(diǎn),比如,在設(shè)計(jì)即將用for 讀取的配

置文件的時(shí)候,可以在注釋文字的行首加上分號(hào),例如在編寫(xiě)病毒文件查殺代碼

的時(shí)候,可以通過(guò) for 語(yǔ)句來(lái)讀取病毒文件列表,那么,病毒文件列表.ini 這個(gè)

配置文件可以這樣寫(xiě): 

;以下是常見(jiàn)的病毒文件,請(qǐng)見(jiàn)一個(gè)殺一個(gè)^_^ 

;copyleft:沒(méi)有 

qq.exe 

msn.exe 

iexplore.exe 

   如果要取消這個(gè)默認(rèn)設(shè)置,可選擇的辦法是: 

   1、為eol=指定另外一個(gè)字符; 

   2、使用  for /f "eol="  語(yǔ)句,也就是說(shuō),強(qiáng)制指定字符為空,就像對(duì)付delims=

一樣。 

    (六)如何決定該使用  f or  /f  的哪種句式?(兼談usebackq 的使用) 

   for /f %%i in („„) do („„)  語(yǔ)句有好幾種變形語(yǔ)句,不同之處在于第一個(gè)

括號(hào)里的內(nèi)容:有的是用單引號(hào)括起來(lái),有的是用雙引號(hào)包住,有的不用任何符

號(hào)包裹,具體格式為: 

   1、for /f %%i in (文件名) do („„) 

   2、for /f %%i in ('命令語(yǔ)句') do („„) 

   3、for /f %%i in ("字符串") do („„) 

   看到這里,我想很多人可能已經(jīng)開(kāi)始犯了迷糊了:如果要解決一個(gè)具體問(wèn)題,

面對(duì)這么多的選擇,如何決定該使用哪一條呢? 

   實(shí)際上,當(dāng)我在上面羅列這些語(yǔ)句的時(shí)候,已經(jīng)有所提示了,不知道你是否

注意到了。 

   如果你一時(shí)無(wú)法參透其中奧妙,那也無(wú)妨,請(qǐng)聽(tīng)我一一道來(lái)便是。 

   1、當(dāng)你希望讀取文本文件中的內(nèi)容的話,第一個(gè)括號(hào)中不用任何符號(hào)包裹,

應(yīng)該使用的是第1 條語(yǔ)句;例如:你想顯示test.txt 中的內(nèi)容,那么,就使用  for 

/f %%i in (test.txt) do echo %%i; 

   2、當(dāng)你讀取的是命令語(yǔ)句執(zhí)行結(jié)果中的內(nèi)容的話,第一個(gè)括號(hào)中的命令語(yǔ)

句必須使用單引號(hào)包裹,應(yīng)該使用的是第2 條語(yǔ)句;例如:你想顯示當(dāng)前目錄下

文件名中含有test 字符串的文本文件的時(shí)候,應(yīng)該使用  for /f %%i in ('dir /a-d 

/b *test*.txt') do echo %%i  這樣的語(yǔ)句; 

   3、當(dāng)你要處理的是一個(gè)字符串的時(shí)候,第一個(gè)括號(hào)中的內(nèi)容必須用雙引號(hào)

括起來(lái),應(yīng)該是用的是第 3 條語(yǔ)句;例如:當(dāng)你想把 bbs.bathome.cn 這串字符

中的點(diǎn)號(hào)換為短橫線并顯示出來(lái)的話,可以使用  for  /f  "delims=. 

tokens=1-3"  %%i  in  ("bbs.bathome.cn")  do  echo  %%i-%%j-%%k  這樣的語(yǔ)

句。 

   很顯然,第一個(gè)括號(hào)里是否需要用符號(hào)包裹起來(lái),以及使用什么樣的符號(hào)包

裹,取決于要處理的對(duì)象屬于什么類型:如果是文件,則無(wú)需包裹;如果是命令

語(yǔ)句,則用單引號(hào)包裹;如果是字符串,則使用雙引號(hào)括起來(lái)。 

   當(dāng)然,事情并不是絕對(duì)如此,如果細(xì)心的你想到了批處理中難纏的特殊字符,

你肯定會(huì)頭大如斗。 

   或許你頭腦中靈光一閃,已經(jīng)想到了一個(gè)十分頭痛的問(wèn)題:在第1 條語(yǔ)句中,

如果文件名中含有空格或&,該怎么辦? 

   照舊嗎? 

   拿個(gè)叫  test 1.txt  的文件來(lái)試試。 

   你很快寫(xiě)好了代碼,新建文件-->碼字-->保存為批處理,前后費(fèi)時(shí)不到 1 分

鐘: 

[code17] 

@echo off 

for /f %%i in (test 1.txt) do echo %%i 

pause 

   你興沖沖地雙擊批處理,運(yùn)行后,屏幕上出現(xiàn)了可恥的報(bào)錯(cuò)信息:系統(tǒng)找不

到文件  test  。 

   當(dāng)你把  test 1.txt  換成  test&1.txt  后,更怪異的事情發(fā)生了:CMD 窗口在你

眼前一閃而過(guò),然后,優(yōu)雅地消失了。 

   你可能覺(jué)得自己的代碼寫(xiě)錯(cuò)了某些符號(hào),你再仔細(xì)的檢查了一次,確認(rèn)沒(méi)有

筆誤,然后,你再次雙擊批處理,結(jié)果問(wèn)題照舊;你開(kāi)始懷疑其他程序?qū)λ赡?/p>

有影響,于是關(guān)掉其他窗口,再運(yùn)行了一次,問(wèn)題依舊;你不服氣地連續(xù)運(yùn)行了

好幾次,還是同樣的結(jié)果。 

   怪哉! 

   你一拍大腿,猛然想起了一件事:當(dāng)路徑中含有特殊字符的時(shí)候,應(yīng)該使用

引號(hào)把路徑括起來(lái)。對(duì),就是它了! 

   但是,當(dāng)你把代碼寫(xiě)出來(lái)之后,你很快就焉了:for /f %%i in ("test 1.txt") do 

echo  %%i,這不就是上面提到的第3 條  for  /f  命令的格式嗎?批處理會(huì)把  test 

1.txt  這個(gè)文件名識(shí)別為字符串。 

   你百無(wú)聊賴地在CMD 窗口中輸入  for /?  ,并重重地敲下了回車,漫無(wú)目的

地在幫助信息中尋找,希望能找到點(diǎn)什么。 

   結(jié)果還真讓你到了點(diǎn)什么。 

   你看到了這樣的描述: 

指定新語(yǔ)法已在下類情況中使用: 

在作為命令執(zhí)行一個(gè)后引號(hào)的字符串并且一個(gè)單 

引號(hào)字符為文字字符串命令并允許在  filenameset 

中使用雙引號(hào)擴(kuò)起文件名稱。 

   但是,通讀一遍之后,你卻如墜五里霧中,不知所云。 

   還好,下面有個(gè)例子,并配有簡(jiǎn)單的說(shuō)明: 

       FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i 

     會(huì)枚舉當(dāng)前環(huán)境中的環(huán)境變量名稱。 

   你仔細(xì)對(duì)比了 for  /f 語(yǔ)句使用usebackq 和不使用usebackq 時(shí)在寫(xiě)法上的差

別,很快就找到了答案:當(dāng)使用了 usebackq 之后,如果第一個(gè)括號(hào)中是一條命

令語(yǔ)句,那么,就要把單引號(hào)'改成后引號(hào)`(鍵盤(pán)左上角esc 鍵下面的那個(gè)按鍵,

與~在同一鍵位上)。 

   回過(guò)頭去再看那段關(guān)于 usebackq 的描述,字斟句酌,反復(fù)揣摩,終于被你

破譯了天機(jī):usebackq  是一個(gè)增強(qiáng)型參數(shù),當(dāng)使用了這個(gè)參數(shù)之后,原來(lái)的for

語(yǔ)句中第一個(gè)括號(hào)內(nèi)的寫(xiě)法要做如下變動(dòng):如果第一個(gè)括號(hào)里的對(duì)象是一條命

令語(yǔ)句的話,原來(lái)的單引號(hào)'要改為后引號(hào)`;如果第一個(gè)括號(hào)里的對(duì)象是字符串

的話,原來(lái)的雙引號(hào)"要改為單引號(hào)';如果第一個(gè)括號(hào)里的對(duì)象是文件名的話,

要用雙引號(hào)"括起來(lái)。 

   驗(yàn)證一下,把[code17]改寫(xiě)成如下代碼: 

[code18] 

@echo off 

for /f "usebackq" %%i in ("test 1.txt") do echo %%i 

pause 

   測(cè)試通過(guò)! 

   此時(shí),你很可能會(huì)仰天長(zhǎng)嘆:Shit,微軟這該死的機(jī)器翻譯! 

   至于把[code17]代碼中的空格換成&后,CMD 窗口會(huì)直接退出,那是因?yàn)?amp;

是復(fù)合語(yǔ)句的連接符,CMD 在預(yù)處理的時(shí)候,會(huì)優(yōu)先把&前后兩部分作為兩條

語(yǔ)句來(lái)解析,而不是大家想象中的一條完整的for 語(yǔ)句,從而產(chǎn)生了嚴(yán)重的語(yǔ)法

錯(cuò)誤。因?yàn)闋可娴筋A(yù)處理機(jī)制問(wèn)題,不屬于本節(jié)要討論的內(nèi)容,在此不做詳細(xì)講解

   這個(gè)時(shí)候,我們會(huì)吃驚地發(fā)現(xiàn),區(qū)區(qū)一條for 語(yǔ)句,竟然有多達(dá)6 種句型: 

   1、for /f %%i in (文件名) do („„) 

   2、for /f %%i in ('命令語(yǔ)句') do („„) 

   3、for /f %%i in ("字符串") do („„) 

   4、for /f "usebackq" %%i in ("文件名") do („„) 

   5、for /f "usebackq" %%i in (`命令語(yǔ)句`) do („„) 

   6、for /f "usebackq" %%i in ('字符串') do („„) 

   其中,4、5、6 由1、2、3 發(fā)展而來(lái),他們有這樣的對(duì)應(yīng)關(guān)系:1-->4、2-->5、

3-->6。 

   好在后3 種情形并不常用,所以,牢牢掌握好前三種句型的適用情形就可以

了,否則,要在這么多句型中確定選擇哪一條語(yǔ)句來(lái)使用,還真有點(diǎn)讓人頭腦發(fā)

   至于  for /f  為什么要增加usebacq 參數(shù),我只為第4 條語(yǔ)句找到了合理的解

釋:為了兼容文件名中所帶的空格或&。它在第 5、6 條語(yǔ)句中為什么還有存在

的必要,我也不是很明白,這有待于各位去慢慢發(fā)現(xiàn)。 

一些常用的dos命令

 pause 
 暫停命令


find
搜索文件或文件內(nèi)指定的字符串


prompt
設(shè)置命令提式符


ren  
批量重名

用法:ren 1.txt 2.bat  

效果:1.txt就被改為2.bat


subst s: \\*.*.*.*\c$ (這個(gè)是遠(yuǎn)程映射)
\\*.*.*.*將c盤(pán)下windows映視到s盤(pán)下
刪除的話是 
這個(gè)是使用例子:subst s: /d


regedit /s
用法:regedit /s 1.reg
在批處理中運(yùn)行所有注冊(cè)表文件而不顯示    


assoc
修改文件關(guān)聯(lián)         


dir 
查看本目錄文件


dir /s /p "*.txt" 
顯示當(dāng)前所在盤(pán)所有txt文件


rd 
刪除目錄   

"rd /s" 是刪除目錄下所有東西 

rd /s 123 刪除123目錄下的全都東西


del 
刪除文件

例子:del /f F:\xx

效果:刪除F盤(pán)下的xx文件


type 
查看文件內(nèi)容命令 比如*.txt


attrib 
更改文件屬性命令


move 
剪切命令 "move 1.bat 123"  1.bat文件剪切到123目錄


format 
格式化命令 "format d: \q"

chkdsk
檢查磁盤(pán)

path
path=c:\dos;c:\win
搜索當(dāng)前可執(zhí)行程序


copy 
復(fù)制文件命令 比如: "copy 1.txt 2" 就是1的文件 復(fù)制到2文件夾里面 copy不能復(fù)制目錄
copy cmd.exe \\192.168.1.102\c$
將cmd復(fù)制到192.168.1.102的盤(pán)下


xcopy 
高級(jí)復(fù)制命令 "xcopy aaa a123 /e" 將aaa目錄復(fù)制到123目錄


title 
更改cmd標(biāo)題命令 如 "title 腳本之家"  標(biāo)題就改成腳本之家了.


color 
更改背景參數(shù)如 "color 07" 就是黑色背景白色字 "color 12" 就是藍(lán)色背景綠色字 詳細(xì)見(jiàn)color /?


defrag 
磁盤(pán)碎片整理 "defrag c: -a" 對(duì)C盤(pán)的碎片進(jìn)行分析不處理 "defrag c: -f" 進(jìn)行處理


ipconfig 
查看本機(jī)ip地址命令


CLS 
清屏


tree 
顯示當(dāng)前所以文件文件夾和結(jié)構(gòu)


call 
運(yùn)行另一個(gè)批處理 不結(jié)束父進(jìn)程


mstsc   
遠(yuǎn)程桌面連接


ping 計(jì)算機(jī)名字 
計(jì)算機(jī)名稱得到ip
ping的返回ttl值確認(rèn)操作系統(tǒng) 
xp/2000的ttl值128      
windwos98為64      
unix為255


ping /n 3 127.0.0.0>nul
向ip發(fā)送3次,沿遲6秒


date   
顯示當(dāng)前日期 沒(méi)現(xiàn)在時(shí)間


TIME    
顯示當(dāng)前時(shí)間 當(dāng)不會(huì)更新時(shí)間


taskkill   
結(jié)束進(jìn)程


tasklist    
查看進(jìn)程


echo 再見(jiàn) & pause>nul    
結(jié)束的時(shí)候不是請(qǐng)安任何鍵結(jié)束 而是再見(jiàn) 可以在再見(jiàn)里面隨意寫(xiě) 同時(shí)也可以去除“echo 再見(jiàn) &”就什么都沒(méi)顯示了


shutdown  
關(guān)機(jī)命令

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)