第二節 FOR的集合與變量
本節將FOR的“集合”和“變量”放在一起的原因是,兩者之間存在著(zhù)相互關(guān)系。
集合向變量提供元素替換變量,因此是供應者,它決定了變量的取值范圍。用術(shù)語(yǔ)說(shuō),集合賦值給形式變量。
變量為集合內的元素提供賦值位置,它只能從集合限定的范圍取值,因此是需求者。
集合賦值給變量,變量又向DO命令賦值,這個(gè)過(guò)程構成一個(gè)FOR的循環(huán)。集合內元素的總量決定了FOR循環(huán)的次數。
二、集合
(一)概述
FOR命令常見(jiàn)的三種表達方式:IN (Command1)、 IN (集合)、 IN (Set)。
集合,也稱(chēng)集。在批處理里,它確定一個(gè)范圍、總量,是一個(gè)數據庫,由固定數值(元素)組成,向變量提供固定數值,用于替換變量。變量和集合的關(guān)系是需求與供給的關(guān)系。集合的個(gè)數決定了需要循環(huán)的次數。
集合必須用圓括號括起來(lái)。
集合里的內容包羅萬(wàn)象??梢允菃蝹€(gè)字符,也可以是字符串,可以是文件,也可以是命令。我們見(jiàn)得最多有:
路徑+文件名:如c:\note.txt
文本:如歌曲列表.txt
字詞:如我愛(ài)北京天安門(mén)
數字:如123
符號:如+、-、*、\
命令:如’set’
盤(pán)符:如c:\
還有時(shí)間、進(jìn)程、注冊表、服務(wù)、內存管理、啟動(dòng)等等。
集合里可以是只有一個(gè)元素(數值),如:“我愛(ài)北京天安門(mén)”
也可以有多個(gè),如:“c: d: e: f:”
甚至所有、全部,如:*.*
可以確指,如“我愛(ài)北京天安門(mén)”
也可以是模糊的,如:w?s.*
(二)FOR與文件查詢(xún)
由于FOR也可以用來(lái)查詢(xún)文件,FOR結合通配符查詢(xún)文件的功能要比DIR強得多,因此有必要結合通配符來(lái)談?wù)?/span>FOR命令。
通配符(和*)常用來(lái)代替未具體指明的文件和數據。
?代表單個(gè)字符。
* 代表全部字符。
將通配符用于集合內,FOR可以展現強大的搜索能力。
1、查詢(xún)當前目錄(批處理命令所在的位置)的所有文件:
@echo off
for %%i in (*.*) do echo "%%i"
pause
講解:
*.*的第一個(gè)星號表示文件名,第二個(gè)星號表示擴展名,整體表示所有類(lèi)型的文件。
2、列舉當前目錄下所有擴展名為txt的文件:
@echo off
for %%i in (*.txt) do echo "%%i"
pause
講解:
*.txt表示所有擴展名為txt的文件,也就是所有文檔(記事本)文件了。
3、查詢(xún)txt和doc兩種類(lèi)型的文檔:
@echo off
for %%i in (*.doc *.txt) do echo "%%i"
pause
講解:
集合里包含兩個(gè)元素*.doc和*.txt,兩者之間六個(gè)空格。*.doc是所有WORD文檔。
4、查詢(xún)文件名只有兩個(gè)字符的文檔:
@echo off
for %%i in (??.txt) do echo %%i
pause
講解:
表示兩個(gè)字符,也就是文件名只有兩個(gè)字母或兩個(gè)漢字了的文檔。
5、查詢(xún)文件名第二個(gè)字母為O的mp3文件:
@echo off
for %%i in (?o*.mp3) do echo %%i
pause
講解:
6、查詢(xún)以F開(kāi)頭的文件:
@echo off
for %%i in (F*.*) do echo %%i
pause
講解:
F*.*T表示文件名以“F”開(kāi)頭,擴展名以“T”結尾的文件。
7、查詢(xún)含有字母F的文件:
@echo off
for %%i in (*F*) do echo %%i
pause
講解:
文件名含有字母“F”,但不包括文件夾在內。
8、查詢(xún)C盤(pán)下的所有文件,不包括子目錄:
@echo off
for %%i in (c:\*) do echo %%i
pause
9、查詢(xún)C盤(pán)下的所有文件,包括子目錄:
@echo off
For /r c:\ %%i in (*) do echo %%i
Pause
10、查詢(xún)C盤(pán)下的所有文件夾,包括子目錄:
@echo off
For /r c:\ %%i in (.) do echo %%i
Pause
講解:
如果集合只是一個(gè)句點(diǎn) (.),則只枚舉目錄樹(shù)。
似乎除了*,使用其他字符搜索到的都是目錄,但文件夾后面都跟了一個(gè)點(diǎn)號。
11、全盤(pán)搜索文件desktop.ini:
@echo off
FOR %%a IN (C: D: E: F:) DO cd /d %%a & for /r %%b in (desktop.ini) do if exist %%b echo %%b
pause
注意:
凡是涉及D盤(pán)的都搜索不出來(lái),而我的大部分exe都放在D盤(pán),D盤(pán)又沒(méi)設保護,為什么
涉及長(cháng)文件名,中間有空格亦無(wú)法start。如:C:\Program Files,如何解決?
12、搜索F盤(pán)mp3文件:
@echo off
for /r f:\ %%i in (*.mp3) do echo %%i>>music.txt
pause>nul
講解:
將搜索到的mp3文件保存到music.txt文檔中。
(三)常見(jiàn)的集合類(lèi)型
1、 集合內的文字字符串(string)
例:我愛(ài)北京天安門(mén)
for %%I in (我愛(ài)北京天安門(mén)) do echo %%I
2、集合內的文件名(filename-set)
例:靜夜思.txt
for /f %%i in (靜夜思.txt) do echo %%i
3、集合內的命令(command)
例:二次過(guò)濾:
for /f "eol=;" %%a in ('for /f "eol=S" %%b in ^(a.txt^)do @echo %%b') do echo %%a
4、集合內的變量(%var%)
例:自動(dòng)關(guān)機:
set times=
set /p times=請輸入關(guān)機時(shí)間:
:: 以下語(yǔ)句實(shí)現每個(gè)星期的每一天指定時(shí)間關(guān)機
:: 如果要換成每個(gè)月的某幾天,請改字母為數字,并用逗號分隔
:: 以下代碼沒(méi)有錯誤檢測語(yǔ)句,輸入時(shí)間的時(shí)候務(wù)必按照指定格式輸入
:: 可以用在CMD窗口用at命令來(lái)查看計劃任務(wù)
if not "%times%"=="" for %%i in (%times%) do (
at %%i /every:M,T,W,Th,F,S,Su shutdown -s
)
二、變量的用法 (一)概述 1、FOR命令必須使用變量,且變量的格式是兩個(gè)百分號緊挨一個(gè)字母,如:%%a。 同一個(gè)FOR命令內,變量后面的字母之間存在先后順序。一般情況下,使用了%%a做變量,再增加個(gè)變量的話(huà)就應該是%%b、%%c,依此類(lèi)推。 變量要區分大小寫(xiě),%%A是不同于%%a的。 2、 3、變量的固值化。 這段是廢話(huà),可免讀。 前面提到過(guò),變量其實(shí)是一個(gè)虛擬的位置,該位置是想DO提供命令執行對象的。同時(shí)它也向集合提供跳板,集合里的元素要出來(lái)執行DO后面的命令,它就要替換外面的變量,用變量做跳板執行DO。說(shuō)白了,其實(shí)是變量借了集合的名,變量本身沒(méi)有任何實(shí)質(zhì)東西,真正執行DO的是集合里的元素,而非變量本身。 為什么不跳過(guò)變量這一關(guān)直接用集合內的元素執行DO?這個(gè)問(wèn)題比較深奧,這里不做討論。這涉及到變量的存在設計,最好去問(wèn)工程師。 用前面的“鑰匙的啟示”來(lái)說(shuō),鑰匙串提供鑰匙,門(mén)鎖提供鎖孔,兩者缺一不可,兩者合作才能做開(kāi)鎖的動(dòng)作。 變量的固值化說(shuō)白了就是取出一個(gè)鑰匙插入鎖孔內。理論上講就是變量被集合內的元素替換的過(guò)程。如果變量不替換成集合捏的元素,變量就是一個(gè)空殼,空殼無(wú)法完成DO命令。而集合內的元素如果沒(méi)有變量提供的位置,它就毫無(wú)立足之地。 4、輸入變量與輸出變量 簡(jiǎn)單講,DO前面的變量是輸入變量,DO后面的變量是輸出變量。 比如: for %%i in (.) do echo %%i 第一個(gè)%%i是輸入變量,第二個(gè)%%i是輸出變量。 做個(gè)形象的比喻:集合是一個(gè)勞務(wù)輸出大國,它輸出勞動(dòng)力給FOR公司,FOR公司提供就業(yè)崗位%%i,該勞動(dòng)崗位的工作DO就是command2。從FOR公司角度來(lái)看,提供就業(yè)崗位就是輸入變量——吸收人才,參加工作就是輸出變量——創(chuàng )造業(yè)績(jì)。
(二)擴充變量
擴充變量可以增強FOR 命令,以下是拷貝官方的幫助文件,稍作補充。
FOR 變量參照的替換已被增強。您現在可以使用下列選項語(yǔ)法:
~I - 刪除任何引號("),擴充 %I
%%~fI - 將 %I 擴充到一個(gè)完全合格的路徑名(完整路徑名)
%%~dI - 僅將 %I 擴充到一個(gè)驅動(dòng)器號(只顯示盤(pán)符)
%%~pI - 僅將 %I 擴充到一個(gè)路徑(只提取路徑)
%%~nI - 僅將 %I 擴充到一個(gè)文件名(只提取文件名)
%%~xI - 僅將 %I 擴充到一個(gè)文件擴展名(只提取后綴格式)
%%~sI - 擴充的路徑只含有短名(過(guò)長(cháng)的文件名將被縮減)
%%~aI - 將 %I 擴充到文件的文件屬性(a只讀,h隱藏)
%%~tI - 將 %I 擴充到文件的日期/時(shí)間(創(chuàng )建修改時(shí)間)
%%~zI - 將 %I 擴充到文件的大?。?/span>kb)
%%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴充到找到的第一個(gè)完全合格的名稱(chēng)。如果環(huán)境變量名未被定義,或者沒(méi)有找到文件,此組合鍵會(huì )擴充到空字符串。
可以組合修飾符來(lái)得到多重結果:
%%~dpI - 僅將 %I 擴充到一個(gè)驅動(dòng)器號和路徑
%%~nxI - 僅將 %I 擴充到一個(gè)文件名和擴展名
%%~fsI - 僅將 %I 擴充到一個(gè)帶有短名的完整路徑名
%%~dp$PATH:i - 查找列在路徑環(huán)境變量的目錄,并將%I 擴充到找到的第一個(gè)驅動(dòng)器號和路徑。
%%~ftzaI - 將 %I 擴充到類(lèi)似輸出線(xiàn)路的 DIR
在以上例子中,%%I 和 PATH 可用其他有效數值代替。%%~ 語(yǔ)法用一個(gè)有效的 FOR 變量名終止。選取類(lèi)似 %%I 的大寫(xiě)變量名比較易讀,而且避免與不分大小寫(xiě)的組合鍵混淆。
在批處理文件中使用 FOR 命令時(shí),指定變量請使用 %%variable而不要用 %variable。變量名稱(chēng)是區分大小寫(xiě)的,所以 %i 不同于 %I。同時(shí)不能有 52 個(gè)以上都在使用中。
很多人都搞不懂有關(guān)FOR命令的官方幫助文件,因為翻譯實(shí)在太不近人情了。此處你只要抓住以上十一個(gè)擴充變量的用法就可以了,具體作用等你用到了再查吧。
1、選項~I的用法
例:注意觀(guān)察雙引號。
創(chuàng )建文本“刪除引號.txt”:
“你貴姓”
“偶姓‘朱’,名‘立業(yè)’,‘朱立業(yè)’”
“豬立葉?”
“嗯!”
“今年多大了?”
“16。”
"2009年1月15日"
ba"____"ch
"1+1"="?"
‘2’
代碼:
@echo off
FOR /F "delims=" %%i IN (刪除引號.txt) DO echo %%~i
pause
運行結果:
1)中文狀態(tài)的雙引號一個(gè)都沒(méi)消失。證明其對中文狀態(tài)雙引號不起作用。如“16。”
2)英文狀態(tài)的雙引號最外圍的被刪除(簾危┝?。?屑淶幕乖?。?/span>"1+1"="?"
3)英文狀態(tài)的單引號沒(méi)有被刪除。如‘2’
講解:
該命令適合于從其他地方提取字符串,并將字符串中最外圍的雙引號刪除,以便用于做其他命令??聪吕?/span>
@echo off
for %%a in ("偉大的中國人民萬(wàn)歲 萬(wàn)歲 萬(wàn)萬(wàn)歲") do echo.%%~a
pause>nul
運行結果:
偉大的中國人民萬(wàn)歲 萬(wàn)歲 萬(wàn)萬(wàn)歲
講解:
如果不使用雙引號將分段顯示。使用中文狀態(tài)的雙引號顯示結果帶有雙引號。但使用英文狀態(tài)的雙引號(””)結果顯示則很干凈。
2、其他選項的用法
例:只查看文件名:
@echo off
for %%i in (*.*) do echo %%~ni
pause>nul
講解:
%%~ni能夠提取文件名,用此命令來(lái)提取你電腦里的歌曲名稱(chēng)將是最好的選擇。
例:
查看日期大小文件名:
@echo off
for %%i in (*.*) do echo %%~ztni
pause>nul
講解:
有時(shí)候,你想查看文件的日期、大小、屬性等,可以組合使用擴充變量。這個(gè)在殺毒時(shí)或許用得上。
擴充變量雖然多,但用法基本一致,只需用其他擴充變量替換%%~ni即可體驗它們的功效,這里不再一一贅述。
注意擴充變量最后的字母I,它并非固定的,輸入變量是什么它就該是什么。
比如使用%%~$PATH:I:
@echo off
for /r %%a in (*.*) do echo %%~$PATH:a
pause>nul
講解:
第一個(gè)%%a使用了a,那么第二個(gè)%%a還是用a,并不因為增加了擴充變量~$PATH:而改變。不能生套硬搬公式一律用I。
擴充環(huán)境變量常用來(lái)提取一些關(guān)鍵字符,或排除其他一些多余因素。
(三)系統變量
(暫時(shí)省略)
注:此文非本人原創(chuàng ),屬轉載?。?!聯(lián)系客服