@echo off & setlocal EnableDelayedExpansion for /f "tokens=* delims=" %%i in ("Hello world.") do ( set n=%%i set n=!n:ld.=t! set n=!n:o w= S! set n=!n:He=Wi! echo !n! ) pause
將上面代碼保存為.bat雙擊執(zhí)行后會(huì)顯示“Will Sort”字符串,下面將講解每個(gè)語(yǔ)句的意思: 1.@echo off & setlocal EnableDelayedExpansion 關(guān)閉命令回顯,并啟用變量延遲
2.for /f "tokens=* delims=" %%i in ("Hello world.") do ( for命令及其參數(shù)的使用,請(qǐng)大家在論壇里搜索相關(guān)字眼。限于篇幅問(wèn)題,這里不作討論。如果此時(shí)你不明白它的意思,那么你就當(dāng)它的作用是把字符串“Hello world.”賦值給%%i好了,當(dāng)然這只是權(quán)宜之計(jì),以后一定要學(xué)習(xí)for的使用!
為什么會(huì)這樣呢?原因是,在沒(méi)有啟用變量延遲的情況下,凡是在括號(hào)內(nèi)(即do里面)的變量,在執(zhí)行for語(yǔ)句之前,就已經(jīng)被替換成for語(yǔ)句之前其它命令對(duì)該變量所賦予的值。 則是說(shuō)在本例中的以下幾句 set n=%%i set n=%n:ld.=t% set n=%n:o w= S% set n=%n:He=Wi% echo %n% 第一句能正常執(zhí)行并達(dá)到它的目的,因?yàn)樗皇菃渭兊貙?%i的值賦予給變量n,所以沒(méi)有任何問(wèn)題。其它幾句屬這樣情況:早在for語(yǔ)句執(zhí)行前,CMD就急不切待地將這幾句里面的所有變量n一同執(zhí)行替換行為,替換為for之前,其它命令對(duì)n所設(shè)置的值,從而使n變成一個(gè)常量。但在本例中,for語(yǔ)句之前只有@echo off這句,并沒(méi)有其它命令對(duì)n作過(guò)任何賦值行為,所以在for之前,變量n的值為空值。即是說(shuō),set n=%n:ld.=t% 這句里面的變量n,在CMD讀?。ㄗ⒁馐亲x取不是執(zhí)行)完整個(gè)for語(yǔ)句后(這時(shí)還未輪到set執(zhí)行自己的任務(wù)),就立刻被替換為一個(gè)空值,一個(gè)空值里面沒(méi)有任何東西,所以就不存在一字符替換另一字符這種說(shuō)法(沒(méi)有東西怎么替換?)。最終到執(zhí)行set n=%n:ld.=t%語(yǔ)句時(shí),它只是獲取一個(gè)空值,再給變量n賦予空值而已。其它幾句也是一樣原理。
通過(guò)這個(gè)例子的說(shuō)明,相信大家已經(jīng)知道變量延遲的作用吧!我們?cè)倩仡^來(lái)看看例1。 啟用變量延遲后,在執(zhí)行 set n=!n:ld.=t! set n=!n:o w= S! set n=!n:He=Wi! echo !n! 這些語(yǔ)句前,它們里面的變量n不會(huì)馬上被CMD替換(啟用延遲后,CMD變得有耐性啦^_^),而未被替換的話,那么n就還是變量,而不是常量。等到執(zhí)行set n=!n:ld.=t!等這幾句時(shí),變量n才被替換。這樣每個(gè)set命令都能感知變量n的任何變化,從而作出正確的替換行為。這就是變量延遲啦!