for語(yǔ)句從入門(mén)到精通(未完)_百度文庫(kù)_第1頁(yè)
for語(yǔ)句從入門(mén)到精通(未完)_百度文庫(kù)_第2頁(yè)
for語(yǔ)句從入門(mén)到精通(未完)_百度文庫(kù)_第3頁(yè)
for語(yǔ)句從入門(mén)到精通(未完)_百度文庫(kù)_第4頁(yè)
for語(yǔ)句從入門(mén)到精通(未完)_百度文庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一列是數(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)有指定"d

2、elims=符號(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)階話(huà)題:如果我要指定的符號(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再改造一下: code7 echo off for /f "delims=

3、.," %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è)的字符串片段,稱(chēng)之為節(jié)),然后,for /f 會(huì)提取第一節(jié)的內(nèi)容作為最終結(jié)果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串被切分成了兩個(gè)以上的節(jié),但是,code7的代碼只會(huì)

4、提取第一節(jié)字符串的內(nèi)容,因?yàn)?for /f 語(yǔ)句默認(rèn)只提取第一節(jié)的符串。 (三) 定點(diǎn)提?。簍okens= 上一節(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)容并不是一成不變的。 下面

5、來(lái)看一個(gè)例子: txt2 尺有所短,寸 有所長(zhǎng),學(xué)好批處理沒(méi)商量,考慮問(wèn)題復(fù)雜化,解決問(wèn)題簡(jiǎn)潔化。 對(duì)txt2這段文本,假設(shè)它們保存在文件test.txt中,如果我想提取“學(xué)好批處理沒(méi)商量”這句話(huà),該如何寫(xiě)代碼呢? 我們稍微觀(guān)察一下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了,最終的代碼如下: code8 echo off for /f "delims=, tok

6、ens=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é)

7、果中顯示出來(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)在回頭去看code

8、9,你應(yīng)該知道如何修改才能滿(mǎn)足題目的要求了吧?修改結(jié)果如下: code10 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)容,稍加思索,你可能很快就得出了答案: code11 echo off for /f "delims=, tokens=1,2,3,4,5" %i in (test.txt do echo %i %j %k %l %m pause 寫(xiě)完之后

9、,你可能意識(shí)到這樣一個(gè)問(wèn)題:假如要提取的“節(jié)”數(shù)不是5,而是10,或者20,或者更多,難道我也得從1寫(xiě)到10、20或者更多嗎?有沒(méi)有更簡(jiǎn)潔的寫(xiě)法呢? 答案是有的,那就是:如果要提取的內(nèi)容是連續(xù)的多“節(jié)”的話(huà),那么,連續(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ě)法: code12 for /f "delims=, tokens=1,

10、*" %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,* 中,

11、星號(hào)前面緊跟的是數(shù)字1;第一節(jié)字符串被切分完之后,其余部分字符串不做任何切分,整體作為第二節(jié)字符串,這樣,txt2就被切分成了兩節(jié),分別被變量%i和變量%j接收。 以上幾種切分方式可以結(jié)合在一起使用。不知道下面這段代碼的含義你是否看得懂,如果看不懂的話(huà),那就運(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í)候,有用的信息并

12、不是貫穿文本內(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è)行注釋

13、字符的結(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é)合第二條解釋?zhuān)胖纄ol有忽略指定行的功能。但是,這兩條解釋是互相矛盾的:到底是忽略以指定 字符打頭的行,還是忽略以指定字符結(jié)尾的行? 實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),還是用代碼來(lái)檢驗(yàn)一下eol的作用吧: code15 echo o

14、ff 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è)

15、計(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ǔ)句

16、來(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=一樣。 (六)如何決定該使用 for /f 的哪種句式?(兼談usebackq的使用 for /f %i in ( do ( 語(yǔ)句有好幾種變形語(yǔ)句,不同之處在于第一個(gè)括號(hào)里的內(nèi)容:有的是用單引號(hào)括起來(lái),有的是用雙引

17、號(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)你 結(jié)果還真讓你到了點(diǎn)什么。 你看到了這樣的描述: usebackq - 指定新語(yǔ)法已在下類(lèi)情況中使用:

18、 在作為命令執(zhí)行一個(gè)后引號(hào)的字符串并且一個(gè)單 引號(hào)字符為文字字符串命令并允許在 filenameset 中使用雙引號(hào)擴(kuò)起文件名稱(chēng)。 但是,通讀一遍之后,你卻如墜五里霧中,不知所云。 還好,下面有個(gè)例子,并配有簡(jiǎn)單的說(shuō)明: FOR /F "usebackq delims=" %i IN (set DO echo %i 會(huì)枚舉當(dāng)前環(huán)境中的環(huán)境變量名稱(chēng)。 你仔細(xì)對(duì)比了for /f語(yǔ)句使用usebackq和不使用usebackq時(shí)在寫(xiě)法上的差別,很快就找到了答案:當(dāng)使用了usebackq之后,如果第一個(gè)括號(hào)中是一條命令語(yǔ)句,那么,就要把單引號(hào)'改成后引號(hào)(鍵盤(pán)左上角esc鍵

19、下面的那個(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ǔ)句的話(huà),原來(lái)的單引號(hào)'要改為后引號(hào);如果第一個(gè)括號(hào)里的對(duì)象是字符串的話(huà),原來(lái)的雙引號(hào)"要改為單引號(hào)';如果第一個(gè)括號(hào)里的對(duì)象是文件名的話(huà),要用雙引號(hào)"括起來(lái)。 驗(yàn)證一下,把code17改寫(xiě)成如下代碼: code18 echo off for /f "usebackq" %i in

20、("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

21、/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種情形并不常用,所以,牢牢

22、掌握好前三種句型的適用情形就可以了,否則,要在這么多句型中確定選擇哪一條語(yǔ)句來(lái)使用,還真有點(diǎn)讓人頭腦發(fā)懵。 至于 for /f 為 位置,則該行代碼為一條完整的語(yǔ)句。 例如: code20 echo off set num=0 for /f %i in ('dir /a-d /b *.exe' do ( set /a num+=1 echo num 當(dāng)前的值是 %num% echo 當(dāng)前目錄下共有 %num% 個(gè)exe文件 dir /a-d /b *.txt|findstr "test">nul&&( echo 存在含有 test 字符

23、串的文本本件 |echo 不存在含有 test 字符串的文本文件 if exist test.ini ( echo 存在 test.ini 文件 else echo 不存在 test.ini 文件 pause 上面的代碼共有14行,但是只有完整的語(yǔ)句只有7條,它們分別是: 第1條:第1行的echo語(yǔ)句; 第2條:第2行的set語(yǔ)句; 第3條:第3、4、5、6行上的for復(fù)合語(yǔ)句; 第4條:第7行的echo語(yǔ)句; 第5條:第8、9、10行上用&&和|連接的復(fù)合語(yǔ)句; 第6條:第11、12、13行上的ifelse復(fù)合語(yǔ)句; 第7條:第14行上的pause語(yǔ)句。 在這里,我之所以要花

24、這么長(zhǎng)的篇幅來(lái)說(shuō)明一行代碼并不見(jiàn)得就是一條語(yǔ)句,是因?yàn)榕幚淼膱?zhí)行特點(diǎn)是“逐條”執(zhí)行而不是“逐行”執(zhí)行,澄清了這個(gè)誤解,將會(huì)更加理解批處理的預(yù)處理機(jī)制。 在代碼“逐條”執(zhí)行的過(guò)程中,cmd.exe這個(gè)批處理解釋器會(huì)對(duì)每條語(yǔ)句做一些預(yù)處理工作,這就是批處理中大名鼎鼎的“預(yù)處理機(jī)制”。預(yù)處理的大致情形是這樣的:首先,把一條完整的語(yǔ)句讀入內(nèi)存中(不管這條語(yǔ)句有多少行,它們都會(huì)被一起讀入),然后,識(shí)別出哪些部分是命令關(guān)鍵字,哪些是開(kāi)關(guān)、哪些是參數(shù),哪些是變量引用如果代碼語(yǔ)法有誤,則給出錯(cuò)誤提示或退出批處理環(huán)境;如果順利通過(guò),接下來(lái),就把該條語(yǔ)句中所有被引用的變量及變量?jī)蛇叺陌俜痔?hào)對(duì),用這條語(yǔ)句被讀入內(nèi)

25、存之就已經(jīng)賦予該變量的具體值來(lái)替換當(dāng)所有的預(yù)處理工作完成之后,批處理才會(huì)執(zhí)行每條完整語(yǔ)句內(nèi)部每個(gè)命令的原有功能。也就是說(shuō),如果命令語(yǔ)句中含有變量引用(變量及緊鄰它左右的百分號(hào)對(duì)),并且某個(gè)變量的值在命令的執(zhí)行過(guò)程中被改變了,即使該條語(yǔ)句內(nèi)部的其他地方也用到了這個(gè)變量,也不會(huì)用最新的值去替換它們,因?yàn)槟硹l語(yǔ)句在被預(yù)處理的時(shí)候,所有的變量引用都已經(jīng)被替換成字符串常量了,變量值在復(fù)合語(yǔ)句內(nèi)部被改變,不會(huì)影響到語(yǔ)句內(nèi)部的其他任何地方。 順便說(shuō)一下,運(yùn)行代碼code20之后,將在屏幕上顯示當(dāng)前目錄下有多少個(gè)exe文件,是否存在含有 test 字符串的文本文件,以及是否存在 test.ini 這個(gè)文件等信

26、息。讓很多人百思不得其解的是:如果當(dāng)前目錄下存在exe文件,那么,有多少個(gè)exe文件,屏幕上就會(huì)提示多少次 "num 當(dāng)前的值是 0" ,而不是顯示1到N(N是exe文件的個(gè)數(shù))。 結(jié)合上面兩個(gè)例子,我們?cè)賮?lái)分析一下,為什么這兩段代碼的執(zhí)行結(jié)果和我們的期望有一些差距。 在code19中,set num=0&&echo %num%是一條復(fù)合語(yǔ)句,它的含義是:把0賦予變量num,成功后,顯示變量num的值。 雖然是在變量num被賦值成功后才顯示變量num的值,但是,因?yàn)檫@是一條復(fù)合語(yǔ)句,在預(yù)處理的時(shí)候,&&后的%num%只能被set語(yǔ)句之前的語(yǔ)句

27、賦予變量num的具體值來(lái)替換,而不能被復(fù)合語(yǔ)句內(nèi)部、&&之前的set語(yǔ)句對(duì)num所賦予的值來(lái)替換,可見(jiàn),此num非彼num??墒牵谶@條復(fù)合語(yǔ)句之前,我們并沒(méi)有對(duì)變量num賦值,所以,&&之后的%num%是空值,相當(dāng)于在&&之后只執(zhí)行了 echo 這一命令,所以,會(huì)顯示 echo 命令的當(dāng)前狀態(tài),而不是顯示變量num的值(雖然該變量的值被set語(yǔ)句改變了)。 在code20中,for語(yǔ)句的含義是:列舉當(dāng)前目錄下的exe文件,每發(fā)現(xiàn)一個(gè)exe文件,變量num的值就累加1,并顯示變量num的值。 看了對(duì)code19的分析之后,再來(lái)分析code20就不

28、再那么困難了:第3、4、5行上的代碼共同構(gòu)成了一條完整的for語(yǔ)句,而語(yǔ)句"echo num 當(dāng)前的值是 %num%"與"set /a num+=1"同處復(fù)合語(yǔ)句for的內(nèi)部,那么,第4行上set改變了num的值之后,并不能對(duì)第5行上的變量num有任何影響,因?yàn)樵陬A(yù)處理階段,第5行上的變量引用%num%已經(jīng)被在for之前就賦予變量num的具體值替換掉了,它被替換成了0(是被第2行上的set語(yǔ)句賦予的)。 如果想讓代碼code19的執(zhí)行結(jié)果中顯示&&之前賦予num的值,讓代碼code20在列舉exe文件的時(shí)候,從1到N地顯示exe文件的數(shù)量

29、,那又該怎么辦呢? 對(duì)代碼code19,可以把用&&連接復(fù)合語(yǔ)句拆分為兩條單獨(dú)的語(yǔ)句,寫(xiě)成: echo off set num=0 echo %num% pause 但是,這不是我們這次想要的結(jié)果。 對(duì)這兩段代碼都適用的辦法是:使用變量延遲擴(kuò)展語(yǔ)句,讓變量的擴(kuò)展行為延遲一下,從而獲取我們想要的值。 在這里,我們先來(lái)充下電,看看“變量擴(kuò)展”有是怎么一回事。 用CN-DOS里批處理達(dá)人willsort的原話(huà),那就是:“在許多可見(jiàn)的官方文檔中,均將使用一對(duì)百分號(hào)閉合環(huán)境變量以完成對(duì)其值的替換行為稱(chēng)之為“擴(kuò)展(expansion)”,這其實(shí)是一個(gè)第一方的概念,是從命令解釋器的角度進(jìn)行稱(chēng)

30、謂的,而從我們使用者的角度來(lái)看,則可以將它看作是引用(Reference)、調(diào)用(Call)或者獲?。℅et)?!保ㄒ?jiàn):什么情況下該使用變量延遲?- 號(hào)。 既然只要延遲變量的擴(kuò)展行為,就可以獲得我們想要的結(jié)果,那么,具體的做法又是怎樣的呢? 一般說(shuō)來(lái),延遲變量的擴(kuò)展行為,可以有如下選擇: 1、在適當(dāng)位置使用 setlocal enabledelayedexpansion 語(yǔ)句; 2、在適當(dāng)?shù)奈恢檬褂?call 語(yǔ)句。 使用 setlocal enabledelayedexpansion 語(yǔ)句,那么,code19和code20可以分別修改為: echo off setlocal enablede

31、layedexpansion set num=0&&echo !num! pause echo off set num=0 setlocal enabledelayedexpansion for /f %i in ('dir /a-d /b *.exe' do ( set /a num+=1 echo num 當(dāng)前的值是 !num! echo 當(dāng)前目錄下共有 %num% 個(gè)exe文件 dir /a-d /b *.txt|findstr "test">nul&&( echo 存在含有 test 字符串的文本本件 |echo 不存在含有 test 字符串的文本文

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論