批處理教程:FOR入門與進階秘籍
批處理教程:《FOR入門與進階秘籍》之前言、目錄與后記
2009-01-18 22:14
文章來源:http://hi.baidu.com/cjiabing/blog/item/f2512d7f69abac0f29388a70.html
附:謝謝大家對本教程的熱愛和支持,經過不懈的努力,我對該教程進行了重新修改,有時間放上來與大家分享,敬請關注本空間《甲兵時代》原創(chuàng)作品!
前 言
閱讀了許多批處理作品,發(fā)現幾乎每個批處理作品都用到了For命令,真是“無For不批”??!學習批處理,For是必過的一關。
寫這篇文章的時候,我和諸位一樣對For命令一知半解,或者說一無所知。本人喜歡一邊學習,一邊寫教程,呵呵,牛吧?!其實就是學習總結了。通過本學習總結將一些學習心得和大家交流交流。
本文爭取做到簡明、易懂、生動,讓你一看就懂,一學就會。
案例豐富、實用是本教程的一大特色。每個代碼都經過作者的認真的探索和檢測,均能正常使用。由于本人水平有限,有些無法解決的問題也列出來,目的是與大家交流。
閱讀建議:
首先要有玩的興趣和學的渴望。
如遇到不明白的地方,請?zhí)^往下讀。
閱讀過程中要有耐心,循序漸進,不要貪快或怕繁。
一邊閱讀,一般使用代碼做練習,學以致用進步最快。
在未熟悉代碼之前,請用手工輸入代替復制粘貼。
刪除某個關鍵代碼觀察批處理執(zhí)行的效果,加深認識。
有時候不要萬事都問個為什么,記住就行了,以后慢慢再理解。
謙虛地求教,大膽地試驗,合法地使用,熱情地助人。
“站得高,看得遠?!北窘坛讨饕獏⒖剂艘韵录炎鳎?div style="height:15px;">
“塵土飛揚”的《for語句從入門到精通》[2008.12.7更新]》
“隨風”《for 命令f參數通俗講解》
“非常批處理”論壇版主“傷腦筋”的一些文章。
《DOS批處理高級教程精選合編》【20080331(windows Xp)】
《批處理階段教程奧運最終版[英雄出品]》
∮明天去要飯《簡明批處理教程》
《批處理教程電子書》
《dos6.22幫助手冊》
“批處理之家”、“非常批處理”以及“中國DOS聯盟”、“DOS之家”等網站的帖子。
衷心感謝各位作者為批處理的傳播做出的“不可磨滅的貢獻”,并向他們致敬!
為發(fā)揚網絡“自由”、“開放”和“共享”的精神,本教程免費閱讀、轉載和修改,但拒絕商業(yè)目的利用。
感謝我的父母,并將此榮譽贈給我的父母。
歡迎訪問本人博客:
http://hi.baidu.com/cjiabing甲兵時代
2009-1-15
目錄
前言
第一節(jié) FOR的語法
一、概述
二、FOR的語法
三、實戰(zhàn)應用
第二節(jié) FOR的集合與變量
一、FOR的集合
1、概述
2、通配符
3、組合命令
二、FOR的變量
1、概述
2、擴充變量
第三節(jié) FOR的DO
一、概述
二、類型
三、運用
第四節(jié) FOR的參數
一、參數/D
二、參數/R
三、參數/L
四、參數/F
(一)選項EOL
(二)選項Skip
(三)選項Delims
(四)選項Tokens
(五)選項Usebackq
(六)綜合應用
第五節(jié) FOR的綜合應用
一、FOR與其他命令的組合
二、精選例句
后記
后 記
批處理看似簡單,其實博大精深,我們只好學習FOR的精神,一塊一塊的將它啃下來。這里用一段搞笑對話做結,提前祝大家新年快樂。歡迎訪問甲兵時代的博客:
http://hi.baidu.com/cjiabing徒弟:
師父,你也太不負責任了!好得不是《葵花寶典》,讓我揮刀自宮到一半突然發(fā)現沒有了下篇……&…………@#~¥……
師父:
殘缺的東西才是最有價值的東西嘛!本FOR秘籍雖是殘篇,卻也引領你跨過了批處理最高深莫測的FOR門檻,在批江湖中,你已不知不覺的晉身為一代武林高手。
徒弟:
真的?
師父:
真的,不騙你的!
好了,現在你可以出山了。臨行前為師給你一個忠告,日后不要荒廢了武藝,要牢記恩師教誨,勤加練習,將之發(fā)揚光大。批江湖魚龍混雜,你行俠仗義也罷,違法作惡也罷,為師管不了那么多了,你好自為之吧。
徒弟:
師父,臨行前我有一個請求,我想和你一起過年,可以嗎?
師父:
這個嘛……用for來說,看你口袋有多大,每次從口袋里拿出的紅包有多少,以及送紅包的真誠度。
徒弟:
@惡臭哦 哦方法
佛瑞 %%i in(老師原來也是性情中人啊! 恭祝各位牛年學習進步!~) 的哦 惡臭哦 %%i
怕use》努力
FOR參數F的選項delims與tokens上(原創(chuàng))FOR參數F的選項delims與tokens下(原創(chuàng))批處理:FOR參數之綜合運用下(原創(chuàng))批處理:FOR參數之綜合運用上(原創(chuàng))批處理:FOR參數/F之tokens詳解(原創(chuàng))批處理:FOR的參數/F之delims詳解下(原創(chuàng))批處理:FOR的參數/F之delims詳解上(原創(chuàng))批處理:FOR的參數/F與eol、skip(原創(chuàng))批處理:FOR的參數/L(原創(chuàng))批處理:FOR的參數/D和/R(原創(chuàng))批處理:FOR的變量下(原創(chuàng))批處理:FOR的集與變量中(原創(chuàng))批處理:FOR的集與通配符上(原創(chuàng))批處理:FOR的語法下(原創(chuàng))批處理:FOR的語法上(原創(chuàng))批處理教程:《FOR入門與進階秘籍》之前言、目錄與后記(原創(chuàng))批處理專題(原創(chuàng))本篇為原創(chuàng),轉載請注明出處。
http://hi.baidu.com/cjiabing 甲兵時代,為你服務。
第一節(jié) FOR的語法
恭喜你撿到了一本批處理秘籍《FOR入門與精通》!
本秘籍為做到“一看就懂,一學就會”有些地方反復講解和舉證,如覺得啰嗦請直接跳過??紤]到FOR的參數比較復雜,也是重點,所以放到了最后。如對第二、三節(jié)的內容早已了解請直接跳過。如有其他疑問歡迎訪問本人博客:
http://hi.baidu.com/cjiabing。下面我們開始FOR的神奇之旅……
一、概述
歡迎進入FOR的神奇世界!
FOR就像魔法師手里的魔法棒,武士手里的劍?;蛟S這樣形容更好,批處理命令相當于法術師的魔咒,而FOR就是一句最厲害的的魔法咒語。電影里的道士驅魔的時候,總要念一些經咒,好比“阿彌阿彌哄”,FOR就是這個“阿彌阿彌哄”。實在不行你就當它是阿里巴巴的“芝麻開門”算了,當你在一個批處理里使用FOR命令時,它就能幫你打開一個命令開關,從而幫你打開一個神奇的批處理世界。
課前思考題:
李四送喝醉了的張三回家,張三家門鎖著,沒人在家。李四從張三口袋里掏出一串鑰匙,他不知道哪個鑰匙能開門,你說他該怎么辦?
二、FOR的語法
FOR是一個循環(huán)命令。所謂的循環(huán)指,對一組文件逐一運行一條命令,或對一組文件中的每一個文件執(zhí)行某個特定命令。FOR常用于循環(huán)命令、遍歷查詢、解析文本等。
1、FOR的基本語法格式:
FOR /參數 %%I IN (Command1) DO Command2
FOR /參數 %%字母 IN (集合) DO 命令 [命令參數]
FOR /參數 %%Variable IN (Set) DO Command [Command-Parameters]
(注意:這三條命令的語法格式都一致,只是表示方式不同而已。一般情況下,本教程采用第一條表達,采用第二條講解,采用第三條補充。)
2、用法:
一句話總結:從集合中依次逐一提取變量執(zhí)行后面的命令。
FOR—IN—DO
這是FOR命令的基本結構,三個基本組成部分缺一不可。
FOR:
負責打開循環(huán)命令開關。
IN
負責從集合中抽取元素替換變量。它后面的括號不能省略。
DO
負責安排需要執(zhí)行的命令和動作。它可以是一個命令如echo,也可以是一組命令如if exist。
/參數、%%I、(Command1)、Command2是它的動態(tài)組成部分,也是我們講解的重點。
參數:
用來解釋FOR,設置循環(huán)的模式。FOR常用的參數有/D、/F、/R、/L。
變量:
形式如%%I。集合中用來執(zhí)行后面命令的任意一個可能的數值,需要執(zhí)行命令的對象,一個替換位置。當它空缺時是變量,當FOR運行時它抽取集合里的數值替換自己,從而變成一個固定值。因此它來自集合,限于集合范圍。
集合
范圍、總量。是一個數據庫,由固定數值組成,向變量提供固定數值,用于替換變量。變量和集合的關系是需求與供給的關系。集合的個數決定了需要循環(huán)的次數。集合要用括號括起來,不能缺少。
3、FOR的處理流程:
打開循環(huán)命令FOR。
第一步,從集合中抓取第一個數值A。用A替換形式變量%%I。用被A替換的%%I運行一次DO后面的命令Command2。
第二步、從集合中抓取第二個數值B。用B替換形式變量%%I。用被B替換的%%I運行一次DO后面的命令Command2。
第三步、從集合中抓取第三個數值C。用C替換%%I。用被C替換的%%I執(zhí)行DO后面的命令。
…………
“抓取-替換-執(zhí)行命令”機器根據命令不停地從集合中抓取數值替換變量執(zhí)行后面的命令。一次只處理一個數值,依次循環(huán)下去,直至集合中的數值全部被處理過。
這就是FOR命令的奧秘所在:逐個抓取,依次完成。
三、實戰(zhàn)應用
理論的東西太過抽象,我們用事例來解釋?;仡^看看前面的故事,李四如何用那串鑰匙開鎖?
1、鑰匙的啟示
可能很多人一下子就想到了,既然鑰匙在手中,何不一個一個的試,看哪個能打開。鑰匙有一大串,而門鎖只有一個孔,所以,一次你只能試一根鑰匙。一根一根的試,直到找到那根能夠打開鎖的鑰匙。
FOR的工作原理類似于此。
集合(Command1)相當于鑰匙串,它由許多個數值(鑰匙)組成。變量%%I就是嘗試開門鎖的那根鑰匙,它是從鑰匙串里抓取出來的,不特指哪根。DO+命令就是嘗試開門鎖。
FOR每次從集合(鑰匙串)中抓取一個數值(一根鑰匙),然后用這個數值執(zhí)行DO后面的命令(嘗試開鎖)。FOR不是一次就同時抓取集合里的所有數值(所有鑰匙),而是逐個的抓取,逐個的執(zhí)行,直至輪完所有的數值(鑰匙)。
鑰匙要一個一個的試,數值也是要一個一個的輪。一次一個,輪流完成。
2、我愛北京天安門
為了加深理解,再看一個具體的例子。
@echo off
for %%I in (我愛北京天安門) do echo %%I
pause>nul
運行結果是顯示:
我愛北京天安門
修改一下,用點號把“我愛北京天安門”分成三段:
@echo off
for %%I in (我愛,北京,天安門) do echo %%I
pause>nul
結果顯示:
我愛
北京
天安門
對比一下結果,修改前的顯示結果是一行完整的句子,而修改后的顯示結果變成了三行。為什么會這樣呢?
這要從FOR命令的運行過程說起:
FOR命令要從“我愛北京天安門”這個句子里抽取IN一個字詞作為變量%%I并顯示echo到屏幕上,它必須先區(qū)分和計算這個集合(Command1)“我愛北京天安門”有多少個變量,區(qū)分的方法通常是用點號和空格來隔開每個字詞。上例用兩個點號將“我愛北京天安門”分割成三段:“我愛”、“北京”、“天安門”。
FOR命令執(zhí)行時,它并非一次性將“我愛”、“北京”、“天安門”三個變量同時全部抓出來echo到屏幕上,而是按照先后順序逐個抓取。
它首先抓取IN排在第一位的“我愛”作為形式變量%%I,然后做DO下一步動作,顯示echo到屏幕上。因此,“我愛”成了獨立的第一行。
接著,FOR抓取括號里的第二個元素“北京”作為形式變量顯示到屏幕上,“北京”成為第二行。
第三步,FOR抓取“天安門”顯示到屏幕上成為第三行。
FOR命令就這樣一次一個的、按順序的從括號里(Command1)抓取元素作為形式變量%%I,然后顯示到屏幕上,從第一個輪流循環(huán)到最后一個。
4、手槍
如果把彈夾當作一個集合,子彈當作集合里的元素,槍膛彈槽就是變量,動作命令就是扣動扳機,撞針在彈簧的作用下撞擊子彈,從而把子彈發(fā)射出槍膛。手槍槍膛的彈槽和撞針只有一個,決定了它一次只能打出去一顆子彈,它不能一次同時打出去兩顆子彈。
打手槍的過程很好的解釋了FOR命令執(zhí)行的過程,FOR命令也一樣。它一次只能從集合里抽取一個數值來執(zhí)行后面的命令,而不能同時抽取兩個。
FOR不能一次同時全部執(zhí)行所有集合中的任務,它總是分批、分次的執(zhí)行。時間是一次、數量是一個,方式是依次。本節(jié)不厭其煩、不辭辛苦的舉證、講解的目的就是讓大家明白,FOR命令無論有多復雜它都遵循這條最基本的準則,理解了這點你才能理解FOR命令,在以后FOR的學習運用中左右逢源、得心應手。
5、練習:
1、請默寫出FOR命令的語法格式。
2、請向你的身邊的朋友說說FOR命令的運行過程。
3、請嘗試編寫一個用FOR顯示“l(fā) love you!”的批處理。
@echo off
for %%i in ("l love you!") do echo %%~i
pause>nul
第二節(jié) FOR的集合與變量
本節(jié)將FOR的“集合”和“變量”放在一起的原因是,兩者之間存在著相互關系。
集合向變量提供元素替換變量,因此是供應者,它決定了變量的取值范圍。用術語說,集合賦值給形式變量。
變量為集合內的元素提供賦值位置,它只能從集合限定的范圍取值,因此是需求者。
集合賦值給變量,變量又向DO命令賦值,這個過程構成一個FOR的循環(huán)。集合內元素的總量決定了FOR循環(huán)的次數。
二、集合
(一)概述
FOR命令常見的三種表達方式:IN (Command1)、 IN (集合)、 IN (Set)。
集合,也稱集。在批處理里,它確定一個范圍、總量,是一個數據庫,由固定數值(元素)組成,向變量提供固定數值,用于替換變量。變量和集合的關系是需求與供給的關系。集合的個數決定了需要循環(huán)的次數。
集合必須用圓括號括起來。
集合里的內容包羅萬象??梢允菃蝹€字符,也可以是字符串,可以是文件,也可以是命令。我們見得最多有:
路徑+文件名:如c:\note.txt
文本:如歌曲列表.txt
字詞:如我愛北京天安門
數字:如123
符號:如+、-、*、\
命令:如’set’
盤符:如c:\
還有時間、進程、注冊表、服務、內存管理、啟動等等。
集合里可以是只有一個元素(數值),如:“我愛北京天安門”
也可以有多個,如:“c: d: e: f:”
甚至所有、全部,如:*.*
可以確指,如“我愛北京天安門”
也可以是模糊的,如:w?s.*
(二)FOR與文件查詢
由于FOR也可以用來查詢文件,FOR結合通配符查詢文件的功能要比DIR強得多,因此有必要結合通配符來談談FOR命令。
通配符(和*)常用來代替未具體指明的文件和數據。
?代表單個字符。
* 代表全部字符。
將通配符用于集合內,FOR可以展現強大的搜索能力。
1、查詢當前目錄(批處理命令所在的位置)的所有文件:
@echo off
for %%i in (*.*) do echo "%%i"
rem 也可用for %%i in (*.*) do echo %%i
rem %%i兩邊有雙引號與無雙引號的區(qū)別在于顯示的文件兩側有無雙引號。
pause
講解:
*.*的第一個星號表示文件名,第二個星號表示擴展名,整體表示所有類型的文件。
2、列舉當前目錄下所有擴展名為txt的文件:
@echo off
for %%i in (*.txt) do echo "%%i"
pause
講解:
*.txt表示所有擴展名為txt的文件,也就是所有文檔(記事本)文件了。
3、查詢txt和doc兩種類型的文檔:
@echo off
for %%i in (*.doc *.txt) do echo "%%i"
pause
講解:
集合里包含兩個元素*.doc和*.txt,兩者之間有個空格。*.doc是所有WORD文檔。
4、查詢文件名只有兩個字符的文檔:
@echo off
for %%i in (??.txt) do echo %%i
pause
講解:
表示兩個字符,也就是文件名只有兩個字母或兩個漢字了的文檔。
5、查詢文件名第二個字母為O的mp3文件:
@echo off
for %%i in (?o*.mp3) do echo %%i
pause
講解:
和o存在先后順序,是第一個字符,o是第二個字符,*代表剩余的字符。
6、查詢以F開頭的文件:
@echo off
for %%i in (F*.*) do echo %%i
pause
講解:
F*.*T表示文件名以“F”開頭,擴展名以“T”結尾的文件。
7、查詢含有字母F的文件:
@echo off
for %%i in (*F*) do echo %%i
pause
講解:
文件名含有字母“F”,但不包括文件夾在內。
8、查詢C盤下的所有文件,不包括子目錄:
@echo off
for %%i in (c:\*) do echo %%i
pause
9、查詢C盤下的所有文件,包括子目錄:
@echo off
For /r c:\ %%i in (*) do echo %%i
Pause
10、查詢C盤下的所有文件夾,包括子目錄:
@echo off
For /r c:\ %%i in (.) do echo %%i
Pause
講解:
如果集合只是一個句點 (.),則只枚舉目錄樹。
似乎除了*,使用其他字符搜索到的都是目錄,但文件夾后面都跟了一個點號。
11、全盤搜索文件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盤的都搜索不出來,而我的大部分exe都放在D盤,D盤又沒設保護,為什么
涉及長文件名,中間有空格亦無法start。如:C:\Program Files,如何解決?
12、搜索F盤mp3文件:
@echo off
for /r f:\ %%i in (*.mp3) do echo %%i>>music.txt
pause>nul
講解:
將搜索到的mp3文件保存到music.txt文檔中。
(三)常見的集合類型
1、 集合內的文字字符串(string)
例:我愛北京天安門
for %%I in (我愛北京天安門) do echo %%I
2、集合內的文件名(filename-set)
例:靜夜思.txt
for /f %%i in (靜夜思.txt) do echo %%i
3、集合內的命令(command)
例:二次過濾:
for /f "eol=;" %%a in ('for /f "eol=S" %%b in ^(a.txt^)do @echo %%b') do echo %%a
4、集合內的變量(%var%)
例:自動關機:
set times=
set /p times=請輸入關機時間:
:: 以下語句實現每個星期的每一天指定時間關機
:: 如果要換成每個月的某幾天,請改字母為數字,并用逗號分隔
:: 以下代碼沒有錯誤檢測語句,輸入時間的時候務必按照指定格式輸入
:: 可以用在CMD窗口用at命令來查看計劃任務
if not "%times%"=="" for %%i in (%times%) do (
at %%i /every:M,T,W,Th,F,S,Su shutdown -s
)
二、變量的用法
(一)概述
1、FOR命令必須使用變量,且變量的格式是兩個百分號緊挨一個字母,如:%%a。
同一個FOR命令內,變量后面的字母之間存在先后順序。一般情況下,使用了%%a做變量,再增加個變量的話就應該是%%b、%%c,依此類推。
變量要區(qū)分大小寫,%%A是不同于%%a的。
2、
3、變量的固值化。
這段是廢話,可免讀。
前面提到過,變量其實是一個虛擬的位置,該位置是想DO提供命令執(zhí)行對象的。同時它也向集合提供跳板,集合里的元素要出來執(zhí)行DO后面的命令,它就要替換外面的變量,用變量做跳板執(zhí)行DO。說白了,其實是變量借了集合的名,變量本身沒有任何實質東西,真正執(zhí)行DO的是集合里的元素,而非變量本身。
為什么不跳過變量這一關直接用集合內的元素執(zhí)行DO?這個問題比較深奧,這里不做討論。這涉及到變量的存在設計,最好去問工程師。
用前面的“鑰匙的啟示”來說,鑰匙串提供鑰匙,門鎖提供鎖孔,兩者缺一不可,兩者合作才能做開鎖的動作。 變量的固值化說白了就是取出一個鑰匙插入鎖孔內。理論上講就是變量被集合內的元素替換的過程。如果變量不替換成集合捏的元素,變量就是一個空殼,空殼無法完成DO命令。而集合內的元素如果沒有變量提供的位置,它就毫無立足之地。
4、輸入變量與輸出變量
簡單講,DO前面的變量是輸入變量,DO后面的變量是輸出變量。
比如:
for %%i in (.) do echo %%i
第一個%%i是輸入變量,第二個%%i是輸出變量。
做個形象的比喻:集合是一個勞務輸出大國,它輸出勞動力給FOR公司,FOR公司提供就業(yè)崗位%%i,該勞動崗位的工作DO就是command2。從FOR公司角度來看,提供就業(yè)崗位就是輸入變量——吸收人才,參加工作就是輸出變量——創(chuàng)造業(yè)績。
(二)擴充變量
擴充變量可以增強FOR 命令,以下是拷貝官方的幫助文件,稍作補充。
FOR 變量參照的替換已被增強。您現在可以使用下列選項語法:
~I - 刪除任何引號("),擴充 %I
%%~fI - 將 %I 擴充到一個完全合格的路徑名(完整路徑名)
%%~dI - 僅將 %I 擴充到一個驅動器號(只顯示盤符)
%%~pI - 僅將 %I 擴充到一個路徑(只提取路徑)
%%~nI - 僅將 %I 擴充到一個文件名(只提取文件名)
%%~xI - 僅將 %I 擴充到一個文件擴展名(只提取后綴格式)
%%~sI - 擴充的路徑只含有短名(過長的文件名將被縮減)
%%~aI - 將 %I 擴充到文件的文件屬性(a只讀,h隱藏)
%%~tI - 將 %I 擴充到文件的日期/時間(創(chuàng)建修改時間)
%%~zI - 將 %I 擴充到文件的大?。╧b)
%%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴充到找到的第一個完全合格的名稱。如果環(huán)境變量名未被定義,或者沒有找到文件,此組合鍵會擴充到空字符串。
可以組合修飾符來得到多重結果:
%%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%%~dp$PATH:i - 查找列在路徑環(huán)境變量的目錄,并將%I 擴充到找到的第一個驅動器號和路徑。
%%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
在以上例子中,%%I 和 PATH 可用其他有效數值代替。%%~ 語法用一個有效的 FOR 變量名終止。選取類似 %%I 的大寫變量名比較易讀,而且避免與不分大小寫的組合鍵混淆。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable而不要用 %variable。變量名稱是區(qū)分大小寫的,所以 %i 不同于 %I。同時不能有 52 個以上都在使用中。
很多人都搞不懂有關FOR命令的官方幫助文件,因為翻譯實在太不近人情了。此處你只要抓住以上十一個擴充變量的用法就可以了,具體作用等你用到了再查吧。
1、選項~I的用法
例:注意觀察雙引號。
創(chuàng)建文本“刪除引號.txt”:
“你貴姓”
“偶姓'朱’,名'立業(yè)’,'朱立業(yè)’”
“豬立葉?”
“嗯!”
“今年多大了?”
“16?!?div style="height:15px;">
"2009年1月15日"
ba"____"ch
"1+1"="?"
'2’
代碼:
@echo off
FOR /F "delims=" %%i IN (刪除引號.txt) DO echo %%~i
pause
運行結果:
1)中文狀態(tài)的雙引號一個都沒消失。證明其對中文狀態(tài)雙引號不起作用。如“16?!?div style="height:15px;">
2)英文狀態(tài)的雙引號最外圍的被刪除(簾危┝?。?屑淶幕乖凇H?/span>"1+1"="?"
3)英文狀態(tài)的單引號沒有被刪除。如'2’
講解:
該命令適合于從其他地方提取字符串,并將字符串中最外圍的雙引號刪除,以便用于做其他命令。看下例:
@echo off
for %%a in ("偉大的中國人民萬歲 萬歲 萬萬歲") do echo.%%~a
pause>nul
運行結果:
偉大的中國人民萬歲 萬歲 萬萬歲
講解:
如果不使用雙引號將分段顯示。使用中文狀態(tài)的雙引號顯示結果帶有雙引號。但使用英文狀態(tài)的雙引號(””)結果顯示則很干凈。
2、其他選項的用法
例:只查看文件名:
@echo off
for %%i in (*.*) do echo %%~ni
pause>nul
講解:
%%~ni能夠提取文件名,用此命令來提取你電腦里的歌曲名稱將是最好的選擇。
例:
查看日期大小文件名:
@echo off
for %%i in (*.*) do echo %%~ztni
pause>nul
講解:
有時候,你想查看文件的日期、大小、屬性等,可以組合使用擴充變量。這個在殺毒時或許用得上。
擴充變量雖然多,但用法基本一致,只需用其他擴充變量替換%%~ni即可體驗它們的功效,這里不再一一贅述。
注意擴充變量最后的字母I,它并非固定的,輸入變量是什么它就該是什么。
比如使用%%~$PATH:I:
@echo off
for /r %%a in (*.*) do echo %%~$PATH:a
pause>nul
講解:
第一個%%a使用了a,那么第二個%%a還是用a,并不因為增加了擴充變量~$PATH:而改變。不能生套硬搬公式一律用I。
擴充環(huán)境變量常用來提取一些關鍵字符,或排除其他一些多余因素。
(三)系統(tǒng)變量
(暫時省略)
第三節(jié) FOR的DO
一、概述
DO后面跟一個或一組命令。表示每一次FOR循環(huán)需要執(zhí)行的命令。
有時候,DO后面的命令過于復雜,需要用括號括起來表示一個整體。
二、類型
1、一個命令:
for %%i in (?o*.mp3) do echo %%i
2、一組命令:
for /r d: %%i in (QQ.exe) do if exist %%i start %%i
1、 需要括號:
@echo off
color 0A
for /l %%a in (1,2,8) do (
for /l %%b in (3,3,18) do (
for /l %%c in (100,-15,30) do (
echo %%a %%b %%c
)
)
)
pause
三、運用
(省略,請看第五節(jié)《FOR命令的綜合應用》)
第四節(jié) FOR的參數
FOR常見的參數有/D、/R、/F、/L。內容比較多,需要逐一消化。
課時建議:
參數/D、/R與/L用一課時;參數/F用四課時,其中eol=和skip=用一課時,delims=、tokens=和usebackq各用一課時。下面逐一講解。
一、/D參數——查詢目錄
格式:
FOR /D %%I IN (Command1) DO Command2
用法:
一句話總結:/D用于搜索目錄(或文件夾)。
注意:
只搜索文件夾,不搜索文件。只搜索指定目錄,不搜索子目錄。
例211:搜索C盤下的所有目錄:
@echo off
for /d %%i in (c:\*) do echo %%i
pause
運行結果是顯示C盤下所有的文件夾名字,但不包含子目錄。
例212:搜索當前目錄中的文件夾:
@echo off
for /d %%i in (*) do echo %%i
pause
運行結果是顯示批處理所在目錄下的所有文件夾。
練習:
1、請比較查詢命令DIR與FOR /D。
2、請編寫一個只搜索文件名而不搜索文件夾名的批處理。
二、/R參數——遍歷搜索
格式:
FOR /R %%I IN (Command1) DO Command2
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
注意:
/R后可以指定路徑[[drive:]path]。
用法:
一句話總結:遍歷所有地址搜索文件。
包括搜索所有子目錄。比/D搜索的范圍要大。遍歷?遞歸?全部,每個角落。
通常,/D只搜索當前目錄或者指定目錄,而不深入子目錄。
而/R搜索的范圍從當前目錄或指定目錄開始,深入所有子目錄。無孔不入,大有活要見人死要見尸掘地三尺也要把你找出來的氣勢。
例221:搜索當前目錄下的所有文件。
@echo off
for /r %%i in (*) do echo %%i
pause
運行結果將顯示,當前目錄下的所有文件以及該目錄下所有子目錄里的所有文件。
例222:搜索C盤里所有的擴展名為exe的文件。
@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause
運行結果將顯示C盤和C盤里各個文件夾下的exe文件。殺毒很有用哦。
例:搜索C盤千千靜聽播放器:
@echo off
for /r c:\ %%i in (ttplayer.exe) do if exist %%i start %%i
pause
運行結果將打開千千靜聽,前提是你的千千靜聽裝在C盤。使用if exist的目的是避免文件不存在時不斷的提示錯誤。
檢查了一下,無法讀出長文件名,思考中。如果你的千千靜聽默認安裝在C盤,更簡單的方法是:
start %Progra~1%\ttplayer\ttplayer.exe
講解:
一句命令就足夠了,效率?。∥业脑贒盤都找出來了!
用到環(huán)境變量的內容。不支持長文件名所以使用了%Progra~1%代替Program Files。
例223:搜索F盤里所有目錄。
@echo off
for /r f:\ %%i in (.) do echo %%i
pause
運行結果將顯示F盤以及F盤下所有的文件夾。顯示結果后面都帶有一個點號不懂如何消除,一直在思考一個完美的方式,請諸位指點。
練習:
1、請說說FOR /R的作用。
2、請比較參數/D和/R。
3、請編寫一個全盤搜索QQ.exe的批處理。
4、請編寫一個搜索C盤里所有名字帶“SYS”的文件夾的批處理。
三、/L 參數——序列
格式:
FOR /R %%I IN (Command1) DO Command2
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
用法:
一句話總結:給指定對象建立序列。
/L參數是以增量形式從開始到結束的一個數字序列的迭代數值范圍。
使用迭代變量設置起始值 (Start#),然后逐步執(zhí)行一組范圍的值,直到該值超過所設置的終止值 (End#)。
/L 將通過對 Start# 與 End# 進行比較來執(zhí)行迭代變量。如果 Start# 小于 End#,就會執(zhí)行該命令。如果迭代變量超過 End#,則命令解釋程序退出此循環(huán)。還可以使用負的 Step# 以遞減數值的方式逐步執(zhí)行此范圍內的值。
用FOR給1到5這幾個數字排一下順序。
例:遞增方式。
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
運行結果是生成序列:1 2 3 4 5。
例:遞減方式。
@echo off
for /l %%i in (1,-1,5) do @echo %%i
pause
運行結果是生成序列:5 4 3 2 1。
注意:
集合(start,step,end)中,start表示序列的起始值,end表示序列的結束值,兩者共同決定了序列的取值范圍。
step控制著start和end的生成方式。當step為正時是遞增序列,當step為負時是遞減序列。如果step=0則循環(huán)下去?
例:start,step,end三者的數值關系。
@echo off
for /l %%i in (2,2,13) do echo %%i
pause>nul
運行結果分行顯示2、4、6、8、10、12
講解:
start,step,end三者的數值關系是:
start > end
當step為正時,start+step決定%%i的最小取值范圍,end決定%%i的最大取值范圍。
當step為負時,start+step決定%%i的最大取值范圍,end決定%%i的最小取值范圍。
例:創(chuàng)建三個以數字1、2、3命名的文件夾。
@echo off
for /l %%i in (1,1,3) do md %%i
exit>nul
運行結果將在當前目錄下創(chuàng)建三個以數字命名的文件夾。
講解:“毒蟲”們一看見該命令無比興奮,如果把(1,1,3)里面的3改成九位數的3那豈不是……
個人不是很熟悉,但看人家寫的作品時倒是經常出現這個/l。請看第五節(jié)第三個案例《神奇讀心術》。
練習:
1、請用所學的批處理知識說說(a,-1,z)的意思。
2、請編寫一個打開十個IE瀏覽器窗口的批處理。
3、請編寫一個可以名字是隨機數字擴展名為.exe的批處理。
四、/F 參數
格式:
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]
用法:
一句話總結:常用于文本信息編輯,如查詢、提取、替換等等。
迭代及文件解析,使用文件解析來處理命令輸出、字符串及文件內容。
注意:
帶引號的字符串"options"包括一個或多個指定不同解析選項的關鍵字:eol=、skip=、delims=、tokens=和usebackq。后面將逐個講解。
先創(chuàng)建一個文本文件a.txt,內容如下:
::我的測試
aaa,bbb,ccc,ddd
iii jjj kkk lll
eee,fff,ggg,hhh
你好,甲兵,考試,吃飯
將本內容保存好,后面內容都要用到該文本做試驗。
(一) eol=c 忽略以某字符開頭的行
格式:
FOR /F "eol=c" %%I IN (Command1) DO Command2
用法:
eol=c
一句話總結:表示忽略(隱藏、屏蔽)開頭字符是C的行。
“指定行尾字符(僅一個字符)?!边@是幫助文件里的話,目前不理解它的用法。
Eol=
默認情況下屏蔽冒號開頭的行
如果C是文本某行開頭第一個字符,即“eol=a”,它將在屏幕上屏蔽掉以a開頭的行。
例如:文本“靜夜思.txt”的內容是:
床前明月光,
疑是地上霜;
舉頭望明月,
低頭思故鄉(xiāng)。
如何忽略掉文本文件a.txt中的第三行:“舉頭望明月,”?
@echo off
for /f "eol=舉" %%i in (靜夜思.txt) do echo %%i
pause>nul
運行結果將隱藏第三行。
注意:
如果忽略的字符串的開頭是重復字符,則EOL后只需截取一個字符。
如要“aaa”,“eol=”后只需一個“a”就可以了。同樣,雙冒號“::”只取一個。
練習:
請用skip屏蔽掉文本“a.txt”中的第四行,即隱藏行“eee,fff,ggg,hhh”。
拓展思考:如何文本中的最后一行?
(二)skip=n 忽略前N行
格式:
FOR /F "skip=n" %%I IN (Command1) DO Command2
用法:
一句話總結:忽略文本開頭的前N行。
skip=n表示忽略(屏蔽、隱藏)從第一行到第N行的內容。(n>0)
例:忽略文本a的前四行。
@echo off
for /f "skip=4" %%i in (a.txt) do echo %%i
pause>nul
運行結果將只顯示第五行。
練習:
忽略掉文本“a.txt”中的第一行有幾種方法?
拓展思考:如何單純屏蔽第五行?
(三)delims=符號集 分隔符
附:謝謝大家對本教程的熱愛和支持,經過不懈的努力,我對該教程進行了重新修改,有時間放上來與大家分享,敬請關注本空間《甲兵時代》原創(chuàng)作品!
格式:
FOR /F "Delims=符號集" %%I IN (Command1) DO Command2
用法:
一句話總結:忽略分隔符,切分字符串。
1)以文本中的標點符號來定義分隔符。分隔符通常就是空格鍵和跳格鍵。
2)被定義為分隔符的標點符號將被忽略(隱藏),如果分隔符后面還有內容,默認該分隔符與該內容將被一同忽略,除非使用tokens定義顯示。因此,該命令可以用來屏蔽標點符號和提取第一列的信息。
3)被定義的分隔符前后內容將變成獨立的小節(jié)(或列),這些小節(jié)可以為FOR命令編輯,比如使用tokens提取。
注意:
符號集,指用做分隔符的標點符號可以是一個,也可以是多個。
當delims定義多個分隔符時,符號之間不用空格,用做分隔符的空格要放到最后。
首先要弄清楚分隔符。分隔符就是用delims指定的標點符號了,該標點符號就是文本中的標點符號。注意:這里的分隔符并非文本中的所有標點符號,而是指被delims指定的標點符號。如下圖
其次要弄清楚分節(jié)、分列。我們把每行兩個分隔符之間的文字內容稱為小節(jié)、列。注意:是分隔符之間,而非標點符號之間。如下圖。
例:《易經·乾》的開頭:
乾:元,亨,利,貞。
初九:潛龍,勿用。
九二:見龍再田,利見大人。
九三:君子終日乾乾,夕惕若,厲無咎。
九四:或躍在淵,無咎。
九五:飛龍在天,利見大人。
上九:亢龍有悔。
用九:見群龍無首,吉。
將該內容保存到為文本文件“易經.txt”,下面我們做實驗。
如果使用Delims來定義分隔符,你可以使用原文中的冒號(:),寫法是“Delims=:”(使用英文雙引號)。冒號作為分隔符后,冒號前后的內容被分成兩個小節(jié):
第一小節(jié)(列)
分隔符
第二小節(jié)(列)
第一行
乾
:
元,亨,利,貞。
第二行
初九
:
潛龍,勿用。
第三行
九二
:
見龍再田,利見大人。
第四行
九三
:
君子終日乾乾,夕惕若,厲無咎。
第五行
九四
:
或躍在淵,無咎。
第六行
九五
:
飛龍在天,利見大人。
第七行
上九
:
亢龍有悔。
第八行
用九
:
見群龍無首,吉。
備注:
默認只顯示第一列
默認忽略分隔符
默認忽略第一個分隔符后的內容
批處理:FOR的參數/F之delims詳解下(原創(chuàng))
2009-01-18 22:37
代碼:
@echo off
for /f "delims=:" %%a in (易經.txt) do echo %%a
pause>nul
運行結果將顯示第一小節(jié)(列)的內容。
原因是沒有定義顯示的列,默認情況下忽略第一個分隔符(冒號)后面的內容。
要顯示列,需要用到下節(jié)學習的tokens。如:
@echo off
for /f "tokens=1,2 delims=:" %%a in (易經.txt) do echo %%a %%b
pause>nul
你也可以使用冒號(:)和逗號(,),寫法是“delims=:,”(使用英文雙引號)。原文中的每行文字將被作為分隔符的冒號和逗號分成多個小節(jié):(不知道百度怎么搞的,竟然說我的表格超載!省略了)
代碼:
@echo off
for /f "delims=:," %%a in (易經.txt) do echo %%a
pause>nul
運行結果將顯示第一小節(jié)(列)的內容。
沒有定義列的時候,默認只顯示第一列,忽略分隔符和第一個分隔符后的內容。
例如:文本“靜夜思.txt”的內容是:
床前明月光,疑是地上霜,舉頭望明月,低頭思故鄉(xiāng)。
文本中有四句古詩,詩句之間用逗號分隔。古詩原本是沒有標點符號的,標點符號是后人才加上去的。逗號在語文上是語氣暫停的意思,其實就是用來分隔語句意思以便于閱讀和理解。Delims=,的意思就是提取逗號做分隔符,并以此將詩句分成四個小列或小節(jié)。
第一列
分隔符
第二列
分
隔
符
第三列
分
隔
符
第三列
第一行
床前明月光
,
疑是地上霜
,
舉頭望明月,
,
低頭思故鄉(xiāng)。
如果我要用for將四句詩都顯示到屏幕上,不需要任何參數即能實現:
@echo off
for /f %%i in (靜夜思.txt) do echo %%i
pause>nul
如果我只要“床前明月光”這句話,就需要delims幫忙了:
@echo off
for /f "delims=," %%i in (靜夜思.txt) do echo %%i
pause>nul
講解:
delims=后面跟了一個逗號,表示用原文中的逗號作為分隔符(劃分的方法)將古詩分成四個小節(jié)。默認情況下,delims只顯示分隔符前的第一小節(jié),分隔符通常被忽略掉。顯示其他小節(jié)的詩句要用到列提取命令“tokens”。
仍用前面eol里的文本“a.txt”做試驗。
例:如何只顯示每行的第一個標點前的內容?
@echo off
for /f "eol=: delims=,, " %%i in (a.txt) do echo %%i
pause>nul
運行結果顯示:
aaa
iii
eee
你好
注意:
文本中有英文的點號和中文的逗號,點號要放在逗號前面。
符號集中(也就是=后面的標點符號),各個符號之間沒有空格。
文本中用空格分隔的,符號集里中文逗號后面只有一個空格,且必須放到最后。
用于分隔的標點符號重復的一般只取一個做代表。
for默認是以空格和,:;/等標點符號作分割符的,所以要取得整行內容通常會用"delims="這樣的形式來取消for的默認分割符。
例:為什么第三行的iii后面的內容不見了?
@echo off
for /f %%i in (a.txt) do echo %%i
pause>nul
講解:
這里沒有使用delim進行分隔,而帶有空格的行空格后面的內容被忽略了,原因就是默認情況下,也就是沒有即使沒有用delims選項,for也會以空格作為分隔符,將空格后的內容屏蔽掉。
使用delims的目的主要是通過切分字符串獲得可編輯的字符串以便于進行下一步編輯。Delims好比一把西瓜刀,文本信息就好比西瓜,使用delims這把西瓜刀將文本這個西瓜切分成許多小塊,這樣吃起來就方便了。
如果你想吃其中的某一塊,怎么辦呢?直接用刀叉tokens提取就可以了。請看下節(jié)。
練習:
1、請簡單說說分隔符和標點符號的區(qū)別。
2、請舉例說說delims的作用。
3、請用delims處理以下新聞標題:
第十六屆中共中央組織結構圖_中國共產黨第十七次全國代表大會專題_新聞中心_新浪網.mht
4、請用delims處理以下網頁標題:
關閉垃圾服務讓XP系統(tǒng)運行更順暢運行_系統(tǒng) 垃圾 服務 關閉 需要 內存 這個 共享 占用_中國網管聯盟.mht
批處理:FOR參數/F之tokens詳解(原創(chuàng))
2009-01-18 22:38
(四)tokens=x,y,m-n 提取列
附:謝謝大家對本教程的熱愛和支持,經過不懈的努力,我對該教程進行了重新修改,有時間放上來與大家分享,敬請關注本空間《甲兵時代》原創(chuàng)作品!
格式:
FOR /F "tokens=x,y,m-n" %%I IN (Command1) DO Command2
用法:
一句話總結:提取列。(JT_man注:如果省略,默認只能顯示第1列)
通俗講,共同提取每一行的第m小節(jié)的內容。
因此,可以用該命令來指定提取文本信息。
tokens=有時表示提取全部。
tokens=m表示提取第m列。
tokens=m,n表示提取第m列和第n列。
tokens=m-n表示提取第m列至第n列。
Tokens=*表示刪除每行前面的空格。忽略行首的所有空格。
tokens=m*提取第m列以后的所有字符,星號表示剩余的字符。
tokens=m,*提取第m列及以后的所有字符,星號表示剩余的字符。
輸出變量的個數由定義了的tokens決定。
在 FOR 語句中顯式聲明 %%i。使用tokens= 隱式聲明%%j 和%%k。只要不會引起試圖聲明高于字母“z”或“Z”的某個變量,則使用tokens= 可以指定最多 26 個輸出變量。
接著前面的例子“靜夜思”。
如果我要提取第三小節(jié)“舉頭望明月”,如何做到?
@echo off
for /f "delims=, tokens=3" %%i in (靜夜思.txt) do echo %%i
pause>nul
講解:
首先用delims=,表示命令要用逗號作為詩句的分隔符將四句分成四小節(jié)。然后用tokens=3提取第三小節(jié),即“舉頭望明月”了。
delims=和tokens=共用一對雙引號,如果單獨用雙引號,則FOR命令返回的只能是它們之中的一個。因為在第一節(jié)說過,FOR是逐一讀取命令的,將delims和tokens分開后,FOR只能一次讀取一個,不能一次全部讀取。
注意:
Tokens常和delims一起使用。
首先,一行內容被delims用分割符號如逗號等分隔成許多小段或小節(jié)。
然后,tokens才能提取每行之間對應的這些小段或小節(jié)——列。具體看下面例子。
例:提取前面例子文本“a.txt”中每行的第三段內容“ccc”、“kkk”、“ggg”、“考試”。
@echo off
for /f "skip=1 delims=,, tokens=3" %%i in (a.txt) do echo %%i
pause>nul
注意:為什么kkk不出現呢?
例:如何屏蔽掉文本“a.txt”中的標點符號?
@echo off
for /f "skip=1delims=,, tokens=1-4" %%i in (a.txt) do echo %%i %%j %%k %%l
pause>nul
講解:
%%i %%j %%k %%l是輸出變量,它的個數由tokens后面的(m-n)決定,一般有(n-m+1)個,但不能超過Z。
并且%%后面的字母存在先后順序,%%a %%b是順向,倒過來則是逆向的。
代行號的tokens=m*,星號表示m后面的所有剩余的列。
例:
for /f "tokens=*" %%i in (a.txt) do echo %%i
講解:
沒有指定具體的列,"tokens=*"將提取全部列,后面只需一個輸出變量%%i。
例:
for /f "tokens=2*" %%i in (a.txt) do echo %%i %%j
講解:
"tokens=2*"提取第二列以后的所有字符,星號表示剩余的字符。輸出變量%%i對應于2的輸入變量,%%j對應于星號的輸入變量。
注意:
這里沒有使用delisms但卻以空格分隔了,是因為FOR默認空格是做分隔符的。
例:屏蔽掉“易經.txt”中的標點符號:
@echo off
for /f "tokens=1-5 delims=:," %%a in (易經.txt) do echo %%a %%b %%c %%d %%e
pause>nul
講解:
當delims定義了兩個分隔符“:”和“,”時,提取列要用到tokens。
有五個列,所以tokens要定義提取第一列至第五列,即1-5,相應地,后面需要五個輸出顯示變量%%a %%b %%c %%d %%e。你也可以這樣修改,避免過多的變量符號【補充?】
你也可以將最后多余的句號定義為分隔符“delims=:,?!睂⑵淦帘蔚?。
練習:
1、 請簡單說說tokens的作用
2、 Tokens=1,3-5后面的輸出變量需要多少個?
3、 請使用tokens提取下面網頁的標題《硬盤知識及故障大總匯(頁 2)》:
手機,3G手機,智能手機,手機電影,手機軟件,手機游戲,鈴聲,主題,圖片,電子書,手機維修,手機大全,手機報價,下載,智能手機的測評,使用心得 硬盤知識及故障大總匯(頁 2) - 電腦技術交流區(qū) - 3g365智能手機論壇 - powered by Discuz! Archiver.mht
批處理:FOR參數/F之usebackq上(原創(chuàng))
2009-01-18 22:40
(五)usebackq
該命令不是很明朗,這里只能指出使用"usebackq"時需要注意的問題,就是集合內使用雙引號、單引號和后引號的情況。
1、 當集合中的文件名file-set含有空格時使用雙引號。
語法:
FOR /F "usebackq" %%I IN (“FileNameSet”) DO Command2
用法:
集合中的文件名或路徑含有空格時,如“file”與“Name”之間有空格,此時需要用雙引號將兩者括起來,保持文件名或路徑的完整性,并在參數后打開"usebackq"。
集合中的文件名沒有空格:
@echo off
For /f %%a in (C:\note.txt) do echo %%a
pause>nul
顯示結果:
能正常讀取文檔note.txt里的內容。
集合中的文件名含有空格,無法讀取文本note.txt里的內容:
@echo off
for /f %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
pause>nul
顯示結果:
系統(tǒng)找不到文件C:\Documents。。
即使加上雙引號也只是將其作為字符串顯示:
@echo off
for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a
pause>nul
顯示結果:
C:\Documents
使用"usebackq"但不加雙引號,會找不到路徑:
@echo off
for /f "usebackq" %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
pause>nul
顯示結果:
系統(tǒng)找不到文件 C:\Documents。。
正確的方式:使用"usebackq"并且在集合中用雙引號將含有空格的文件名包含住。
@echo off
for /f "usebackq" %%a in ("C:\Documents and Settings\Administrator\桌面\note.txt") do echo %%a
pause>nul
顯示結果:成功顯示文檔note.txt里的內容。
講解:
這里所說的是文件名,如“note.txt”,是區(qū)別于后面所說的字符串的。
我的理解,字符串是集合里直接用于屏幕顯示的語句,如“我愛北京天安門”,它不是用于執(zhí)行命令的,也不同于文件名。
文件名是用于間接顯示字符串和打開文件或命令的,如文件名“note.txt”它本身不直接顯示在屏幕上,如果直接顯示就是字符串,如果它的目的是打開文本里的信息那它是文件名。
當文件名或路徑中間帶有空格的時候,如“Documents and Settings”,應該使用usebackq和雙引號。
2、當使用usebackq處理文字字符串時使用單引號。
格式:
FOR /F "usebackq" %%variable IN ('command') DO command [command-parameters]
注意:
'command'使用的是“單引號”,區(qū)別于上面(`set`)的“后引號”
例:
@echo off
for /f "usebackq delims=" %%a in ('Hello "AnsiPeter" Word!') do echo.%%a
pause>nul
顯示結果:
Hello "AnsiPeter" Word!
講解:
前面提到,字符串是用于直接屏幕顯示的語句,顯然“Hello "AnsiPeter" Word”被直接顯示到屏幕上了。這里只是強調usebackq也可以顯示字符串,而且使用單引號,不同于不用usebackq時使用的雙引號。
不使用usebackq也可以顯示字符串,例:
@echo off
for /f "delims=" %%a in ("Hello "AnsiPeter" Word!") do echo.%%a
pause>nul
顯示結果同上
注意:不使用usebackq顯示字符串時,字符串中有空格時必須用英文狀態(tài)下的雙引號。更多請閱讀下一節(jié)的案例“偉大的中國人民萬歲 萬歲 萬萬歲”。
批處理:FOR參數/F之usebackq下(原創(chuàng))
2009-01-18 22:40
3、當集合內是可執(zhí)行的命令時使用“后引號”。
語法:
FOR /F "usebackq" %%variable IN (`command`) DO command [command-parameters]
注意:
后引號在鍵盤上ESC鍵的下面,“~”鍵。英文狀態(tài)下輕按一下。
例:
@echo off
FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i
pause
顯示結果:
枚舉當前環(huán)境中的環(huán)境變量名稱。
講解:
`set`由于使用了usebackq和后引號,因此它表示命令執(zhí)行,即括號內的`set`是FOR以外的一個命令,它在DO后面的echo之前先執(zhí)行了。
命令區(qū)別于文件名和字符串的地方是,命令是批處理中設定可以作用于其他命令、文件名和字符串執(zhí)行相應任務的字母和標點符號。而文件名和字符串通常是被動地接受命令的安排的。因此,命令是早先設計好的,我們只是自由地組合它們而已。
未使用usebackq和使用usebackq時集合內的符號比較:
未使用參數usebackq時:
使用參數usebackq時:
雙引號””
表示字符串,即"string"。
當文件路徑或名稱中有空格時,用雙引號括起來。
單引號’’
表示執(zhí)行命令,即'command' 。
表示字符串,即'string' 。
后引號``
(未研究)
表示命令執(zhí)行,即`command`。
練習:
1、請簡要談談使用usebackq選項時集合內的標點符號該如何表達。
2、如何修改才能打開騰訊游戲?:
@echo off
FOR /F "usebackq delims==" %%i IN (C:\Program Files\Tencent\QQGame\QQGame.exe) DO @echo %%i
pause>nul
3、請說說集合內的“歡迎訪問甲兵時代的博客”是字符號、文件名,還是命令?
@echo off
FOR /F "usebackq delims==" %%i IN ('歡迎訪問甲兵時代的博客’) DO @echo %%i& start iexplore.exe hi.baidu.com\cjiabing
pause>nul
批處理:FOR參數之綜合運用上(原創(chuàng))
2009-01-18 22:42
(六)綜合應用與思考
1、例:將日期中的“-”換成“/”。如將“2009-01-14”改成“2009/01/14”。
@echo off
echo %date%
pause
for /f "tokens=1,2,3 delims=- " %%a in ('date/t') do @echo %%a/%%b/%%c
pause>nul
講解:先用分隔符命令delims屏蔽掉原來的“-”,然后再echo部分用“/”隔開輸出變量。
2、例:提取歌曲名字?,F有一歌曲文本“歌曲列表.txt”,要求從該列表中提取歌名。
“歌曲列表.txt”如下:
2008-04-28 22:19 2,065,777 饒?zhí)炝?玫瑰愛人.wma
2007-10-15 21:09 3,485,010 高一首 我不愿錯過.mp3
2008-10-27 12:25 7,727,549 黃凱芹 傷感的戀人.MP3
2008-11-29 23:56 1,273 黃燦 黃玫瑰.lrc
2008-07-24 20:07 4,129,819 黎姿 如此這般的愛情故事.mp3
代碼:
@echo off
for /f "tokens=4-6 delims=. " %%i in (歌曲列表.txt) do echo %%i %%j %%k
pause>nul
講解:
首先,Delims用點號和空格(點號后面有一個空格)作為分隔符,將上述文本分成4個小節(jié):
第一小節(jié) “2008-04-28”——日期
第二小節(jié) “22:19”——時間
第三小節(jié) “2,065,777” ——大小
第四小節(jié) “饒?zhí)炝?玫瑰愛人.wma”——歌手和歌名
有些歌手與歌名之間含有空格,如“高一首 我不愿錯過.mp3”,那么它們也被拆分成兩節(jié),即:
第四小節(jié) “高一首”——歌手
第五小節(jié) “我不愿錯過.mp3”——歌曲名
其次,用tokens提取每行的第四、五、六小節(jié)(豎豎看就是列),即歌手和歌名。
最后顯示echo出來。
%%i代表顯示提取到的第四列;
%%j代表顯示提取到的第五列;
%%k代表顯示提取到的第六列。
注意:
本命令無法忽略擴展名,也就是無法去掉歌曲的后綴.mp3,試了半天都不行。
如果需要保留擴展名可以同時去掉“delims=.”和“%%k”。
將“tokens=4-6”改成“tokens=4,5”并刪掉%%k似乎可以,但有些第五列仍是歌名或者是后綴名。
單獨用“delims=.”可以去掉,單獨用“tokens=4-6”也可以使用,唯獨將兩者放在一起時出現了問題。
“delims=.”點號后面有一個空格,缺乏空格會無法顯示。
“tokens=4-6”和“delims=.”之間要用一個空格隔開,前后順序不能顛倒,否則無法正常顯示。
如要去掉擴展名,還得使用擴充變量~n:
@echo off
for /f "tokens=4-6" %%i in (歌曲列表.txt) do echo %%~ni %%~nj %%~nk
pause>nul
3、例:在屏幕上完整顯示“偉大的中國人民萬歲 萬歲 萬萬歲”。
(1)不使用/f參數:
@echo off
for %%a in (偉大的中國人民萬歲 萬歲 萬萬歲) do echo.%%a
echo.
echo 不使用/f參數,分節(jié)、分行顯示。
pause>nul
注意:
如果使用雙引號,能夠成功顯示結果,但結果也帶有雙引號,不夠完美。
(2)不使用usebackq:
@echo off
for /f %%a in ("偉大的中國人民萬歲 萬歲 萬萬歲") do echo.%%a
echo.
echo 不使用usebackq,只顯示第一小節(jié)
pause>nul
(3)不使用delims:
@echo off
for /f "usebackq" %%a in ('偉大的中國人民萬歲 萬歲 萬萬歲') do echo.%%a
echo.
Echo 不使用delims,只顯示第一小節(jié)。
pause>nul
顯示結果:
偉大的中國人民萬歲
系統(tǒng)找不到文件 。
注意:
echo.%%a之間有一個點號。為什么?你再增加一個進去看看……
“? ”這是什么東西?
當你刪除echo.%%a之間有一個點號結果就會變成“? ”。
修改一下,加入“delims=”。
批處理:FOR參數之綜合運用下(原創(chuàng))
2009-01-18 22:42
(4)使用delims=以后:
@echo off
for /f "usebackq delims=" %%a in ('偉大的中國人民萬歲 萬歲 萬萬歲') do echo %%a
pause>nul
顯示結果:
偉大的中國人民萬歲 萬歲 萬萬歲
為什么加了delims后就能能夠成功顯示?
思考:如果把單引號改成雙引號或后引號會怎么樣呢?
4、例:編輯“朱子家訓.txt”:
朱子家訓
朱熹
黎明即起,灑掃庭除,要內外整潔。
既昏便息,關鎖門戶,必親自檢點。
一粥一飯,當思來處不易;半絲半縷,恒念物力維艱。
宜未雨而綢繆,毋臨渴而掘井。
自奉必須儉約,宴客切勿留連。
器具質而潔,瓦缶勝金玉。
飲食約而精,園蔬勝珍饈。
勿營華屋,勿謀良田。
(1)單純使用FOR /F即可完整顯示內容。
代碼1:
@echo off
for /f %%a in (朱子家訓.txt) do echo %%a
pause>nul
注意:默認自動取消空行。
(2)使用delims定義分隔符,并屏蔽分隔符(標點),切分字符串。只顯示每行的第一節(jié)。
代碼2:
@echo off
for /f "delims=,;" %%a in (朱子家訓.txt) do echo %%a
pause>nul
(3)使用tokens挑選每行要顯示的小節(jié)。顯示所有內容。
@echo off
for /f "tokens=1-4 delims=,;。" %%a in (朱子家訓.txt) do echo %%a %%b %%c %%d
pause>nul
只顯示第二列和第四列的內容,注意對比內容。
代碼:
@echo off
for /f "tokens=2,4 delims=,;。" %%a in (朱子家訓.txt) do echo %%a %%b
pause>nul
5、比較試驗:
@echo off
for /f %%I in (變量.txt) do echo %%~I
pause>nul
注意:
請修改本命令做試驗,如:
如果不使用參數將顯示“變量.txt”。
如果使用/d顯示“變量.txt”。
如果使用/r則列舉當前目目錄以及當前目錄下的文件夾。
如果使用/f則顯示文本內容。
通過試驗比較,更好的體驗各個參數的意義。同時明白,批處理的命令并非一成不變的,它小巧而靈活,神通而廣大。