需求:
只用cmd命令,將某目錄及其子目錄下所有文件都加上bak后綴。
分析:1. “只用cmd命令”,意味著不能使用TC等工具;
2. “將某目錄及其子目錄下”,意味著要遍歷整個(gè)目錄,dir命令的/S選項(xiàng),以及for命令的/R選項(xiàng)都有遍歷功能;
3. “所有文件”,意味著遍歷時(shí)不能包括目錄,dir /A:-D 可以排除目錄,只列出文件;
4. “加上bak后綴”,可以用ren或move命令。
實(shí)戰(zhàn)一:豪情萬(wàn)丈按照上面的分析,熟練點(diǎn)的很快能寫出:
代碼:
for /F %i in (‘dir /A:-D /S /B‘) do move %i %i.bak
眨一眼就能看懂的可以跳過(guò)下面的段落,直接摁Alt + F4了-.-
不眨眼還看不大懂的不要著急,且聽我慢慢道來(lái)^o^(為了弄清楚來(lái)龍去脈,下面的解釋會(huì)夾雜原始英文釋義)
1. 先解釋 "dir /A:-D /S /B",dir(ectory)命令的作用是
引用:
Displays a list of files and subdirectories in a directory.
DIR [drive:][path][filename] [/A[[:]attributes]] [/b] [/C] [/D] [/L] [/N] [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
|
/A(ttribute):D(irectory) 表示只顯示屬性是目錄的項(xiàng),D前面加個(gè)減號(hào)-, 表示非,因此/A:-D就是顯示所有非目錄的項(xiàng)。
/S(ubdirectories), 表示所有子目錄和子目錄下的文件也都要顯示。
/B(are), 表示顯示最簡(jiǎn)單赤裸的信息就可以了,其它冗余信息都不顯示。對(duì)于dir命令來(lái)說(shuō),就是只顯示長(zhǎng)文件名。
好了,說(shuō)了這么多,其實(shí)很簡(jiǎn)單,dir /A:-D /S /B 的作用就是顯示某目錄及其子目錄下的所有文件列表。可以打開CMD窗口,親身體驗(yàn)一下(注意別在C盤根目錄用這個(gè)命令呵,文件太多,會(huì)刷半天屏的。若不幸使用,請(qǐng)使勁摁Ctrl + C退出)
2. 來(lái)看看 move 和 ren(name) 命令. cmd窗口輸入move /?,一清二楚:
引用:
Moves files and renames files and directories.
To move one or more files: MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination
To rename a directory: MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2
|
/Y中的Y是Yes,-Y就是No了。如果知道有重名的,但依舊想自動(dòng)覆蓋,就加上/Y選項(xiàng),這選項(xiàng)和/S(ilence)選項(xiàng)是我最愛用的選項(xiàng)中的兩個(gè),誰(shuí)用誰(shuí)知道啊。
ren(ame)命令更簡(jiǎn)潔:
引用:
Renames a file or files.
RENAME [drive:][path]filename1 filename2. REN [drive:][path]filename1 filename2.
Note that you cannot specify a new drive or path for your destination file.
|
雖然簡(jiǎn)潔,但不簡(jiǎn)單。首先注意上面的cannot,filename2是不能帶目錄的,就因?yàn)檫@個(gè)原因,我更喜歡用move命令來(lái)替代rename。
值得提的一點(diǎn)是,cmd下的大部分命令都支持通配符的,因此要給某目錄下的文件加bak后綴,只要ren *.* *.*.bak就可以了,如果ren支持/S(ubdirectories),那么 ren /S *.* *.*.bak 就能解決最開始那個(gè)問題,可恨的是rename太簡(jiǎn)潔了,不支持任何選項(xiàng)-.-
3. 接著我們來(lái)看看 for /F %i in (‘command‘). 用cmd的大都聽過(guò)這樣一句武林秘籍:學(xué)會(huì)for,cmd就無(wú)敵了。for是cmd命令中的九陰真經(jīng),此言絕不虛傳。我們一起來(lái)看看這本威力無(wú)窮的經(jīng)書吧:
獲取經(jīng)書的辦法我一般不告訴其他人,上面的命令據(jù)說(shuō)RP不好時(shí)會(huì)引入魔道。如果RP好,請(qǐng)憋著激情澎湃的心情,慢慢將經(jīng)書打開,映入眼簾的是欲練此功......
引用:
Runs a specified command for each file in a set of files.
|
上面這個(gè)官方說(shuō)明其實(shí)有點(diǎn)狹隘,for不僅僅能對(duì)文件集操作,只要是某個(gè)集(set),for就能遍歷處理。
for的基本用法是:
引用:
FOR %variable IN (set) DO command [command-parameters]
|
詳細(xì)解釋我就不多說(shuō)了,經(jīng)書里說(shuō)得非常清楚。這里稍微解釋下幾個(gè)“特殊”用法:
FOR /D %variable IN (set) DO command [command-parameters]
/D 中的D是Directory, 表示只匹配目錄。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
/R 中的R是Recursive, 表示遞歸遍歷,在這里就是遍歷所有子目錄。
利用/R遍歷選項(xiàng),對(duì)于頂樓問題,我們還可以得到下面這個(gè)解決方案:
代碼:
for /R %i in (*.*) do ren %i *.*.bak
FOR /L %variable IN (start,step,end) DO command [command-parameters]
/L 中的L我找了半天也無(wú)法確定是哪個(gè)單詞,很可能是List。/L的含義倒是很清楚,經(jīng)書一點(diǎn)都不含糊。
FOR /F ["options"] %variable IN (set) DO command [command-parameters]
/F中的F是File,這是用得最多的也是最復(fù)雜同時(shí)最有用的一招,經(jīng)書的解釋也很詳細(xì)了,我想來(lái)想去,沒想到值得補(bǔ)充的,想說(shuō)一點(diǎn)的是,/F(ile)和file-set中的File是廣義的,for不僅僅用于文件集,所有字符串集其實(shí)都可以用for處理。此外,/F選項(xiàng)加上后,(set)可以是普通的file-set,還可以是"string" or ‘command‘;如果options中有usebackq,(set)中的表示又略有不同。
其它詳細(xì)解釋,就不多說(shuō)了,所謂師傅領(lǐng)進(jìn)門(自詡為師傅,汗一個(gè)先,hitme師爺別生氣).....
好,九陰真經(jīng)閱讀完畢,回到我們要討論的問題。
來(lái)看看 for /F in %i (‘dir /A:-D /S /B‘) do move %i %i.bak 就很容易懂了,‘dir /A:-D /S /B‘是命令,得到所有文件列表,for 用來(lái)遍歷,對(duì)于列表中的每一行,存儲(chǔ)到 %i 變量,然后執(zhí)行 move %i %i.bak 重命名,大功告成。
小結(jié):
1. 在實(shí)戰(zhàn)一中,我們學(xué)會(huì)了dir、move、rename、for四個(gè)命令。
2. 對(duì)于頂樓的問題,我們得到了兩個(gè)解決方案:
方案一:
代碼:
for /F %i in (‘dir /A:-D /S /B‘) do move %i %i.bak
方案二:
代碼:
for /R %i in (*.*) do ren %i *.*.bak
實(shí)戰(zhàn)二:莫撞墻高高興興的把上面的解決方案交給了老板(不僅提供了,而且提供了兩個(gè),老板總該滿意了吧),誰(shuí)料屋不漏卻遭連環(huán)雷,舒舒服服的決定逛會(huì)CCF和DRL水區(qū)之時(shí),電話鈴聲大作,老板發(fā)火了:“搞什么搞,兩個(gè)命令運(yùn)行了,文件后綴一個(gè)也沒加上,糊弄我是吧,不趕快搞定扣你績(jī)效......”
暈啊,汗都來(lái)了,什么破老板,是不是不會(huì)開cmd窗口?上面的命令怎么會(huì)有錯(cuò)呢?萬(wàn)般無(wú)奈,遠(yuǎn)程協(xié)助老板,不運(yùn)行不知道,一運(yùn)行也不嚇一跳:
引用:
Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. ...... lifesinger@bpwang ~# for /R %i in (*) do ren %i *.bak lifesinger@bpwang ~# ren c:\2007.05.21 archivies\公司絕密文件005號(hào).doc *.bak The syntax of the command is incorrect. lifesinger@bpwang ~# ren c:\2007.05.21 archivies\公司絕密文件007號(hào).doc *.bak The syntax of the command is incorrect. ......
|
汗啊,寒窗二十余年,苦練九陰神功,最后居然敗在死背四淫賊手上,數(shù)千年祖輩留下來(lái)的光榮顏面就此毀于一旦,地面無(wú)縫我想鑿啊,天堂無(wú)路我欲飛......
汗流浹背之時(shí),快速搞定:
方案一修正版:
代碼:
for /F "tokens=*" %i in (‘dir /A:-D /S /B‘) do move "%i" "%i.bak"
注意:必須加上"tokens=*",否則%i只能取到第一個(gè)空格前面的部分。
方案二修正版:
代碼:
for /R %i in (*.*) do ren "%i" "*.*.bak"
小結(jié):死背四(Space)淫賊無(wú)處不在,一定要小心小心又小心。
既是總結(jié)也是前言:做而后思之,可以為師矣喜歡折騰Windows系統(tǒng)的,或多或少都接觸過(guò)dos命令。雖然已經(jīng)有很多強(qiáng)大易用的GUI程序,但我始終相信,dos命令以其簡(jiǎn)潔豐富、靈活多高效的特性將會(huì)永遠(yuǎn)存在而且一直被人使用。
cmd命令是dos命令中的基石,如果有精力,我會(huì)一并介紹其他dos下常用的命令行小工具,包括for win32版的ls、grep等。這些小工具強(qiáng)大的生命力,時(shí)常讓我感到驚訝。
打算寫的這個(gè)實(shí)戰(zhàn)系列,對(duì)自己來(lái)說(shuō)是一個(gè)鞏固提高的過(guò)程,同時(shí)很希望這些文章能對(duì)大伙的實(shí)際工作有所幫助,哪怕能節(jié)約你那么一點(diǎn)點(diǎn)時(shí)間,那也是我的愿望。
做而后思之,可以為師矣。我相信任何一個(gè)人,只要愿意在具體操作之后,去追尋思考為什么,就都可以成為CMD專家。希望我的這篇文章能拋磚引玉^o^
最后很感謝CMD王子hitme以及集百長(zhǎng)于一身的高人asap, 從你們的文章以及回復(fù)中,受益匪淺 ^o^