復(fù)制不同文件夾下的同名文件至同一文件夾下并自動(dòng)重命名的批處理 收藏
@echo off setlocal enabledelayedexpansion //告訴CMD要啟用延遲的環(huán)境變量 set count=0 for /f "delims=" %%a in ('dir /b /ad "C:\test\source"') do ( // /b使用空格式(無標(biāo)題信息或摘要)/ad表示顯示目錄 set /a count+=1 // /a指定等號(hào)右邊的字符串為數(shù)字表達(dá)式 copy /y "C:\test\source\%%a\log.txt" "C:\test\dest\log!count!.txt" // /y不使用確認(rèn)是否要改寫現(xiàn)有目標(biāo)文件的提示 ) 當(dāng)CMD讀取了一條完整的語句之后,它不會(huì)立即執(zhí)行變量的擴(kuò)展行為,而會(huì)在某個(gè)單條語句執(zhí)行之前再進(jìn)行擴(kuò)展,也就是說,這個(gè)擴(kuò)展行為被“延遲”了。
在許多可見的官方文檔中,均將使用一對(duì)百分號(hào)閉合環(huán)境變量以完成對(duì)其值的替換行為稱之為“擴(kuò)展(expansion)”,這其實(shí)是一個(gè)第一方的概念,是從命令解釋器的角度進(jìn)行稱謂的,而從我們使用者的角度來看,則可以將它看作是引用(Reference)、調(diào)用(Call)或者獲?。℅et)。
而命令解釋器是擴(kuò)展環(huán)境變量的行為大致如下:首先讀取命令行的一條完整語句,在進(jìn)行一些先期的預(yù)處理之后,命令被解釋執(zhí)行之前,會(huì)對(duì)其中用百分號(hào)閉合的字符串進(jìn)行匹配,如果在環(huán)境空間中找到了與字符串相匹配的環(huán)境變量,則用其值替換掉原字符串及百分號(hào)本身,如果未得到匹配,則用一個(gè)空串替換,這個(gè)過程就是環(huán)境變量的“擴(kuò)展”,它仍然屬于命令行的預(yù)處理范疇。
而一條“完整的語句”,在NT的命令解釋器CMD中被解釋為“for if else”等含有語句塊的語句和用“& | && ||”等連接起來的復(fù)合語句。
因此,當(dāng)CMD讀取for語句時(shí),其后用一對(duì)圓擴(kuò)號(hào)閉合的所有語句將一同讀取,并完成必要的預(yù)處理工作,這其中就包括環(huán)境變量的擴(kuò)展,所以在for中的所有語句執(zhí)行之前,所有的環(huán)境變量都已經(jīng)被替換為for之前所設(shè)定的值,從而成為一個(gè)字符串常量,而不再是變量。無論在for中將那些環(huán)境變量如何修改,真正受到影響的只是環(huán)境變量空間,而非for語句內(nèi)部。
延遲環(huán)境變量擴(kuò)展特性在CMD中缺省是關(guān)閉的,開啟它的方法目前有兩個(gè):一是CMD /v:off,它會(huì)打開一個(gè)新的命令行外殼,在使用exit退出這個(gè)外殼之前,擴(kuò)展特性始終有效,常用于命令行環(huán)境中;二setlocal EnableDelayedExpansion,它會(huì)使環(huán)境變量的修改限制到局部空間中,在endlocal之后,擴(kuò)展特性和之前對(duì)環(huán)境變量的修改將一同消失,常用于批處理語句中。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/doudou321/archive/2009/07/19/4358885.aspx
|
|