很多時候,我看到有人在回複“如何把檔案從A處移動到B處”的時候,給出的建議往往是:先用copy命令複製檔案,然後用del和rd刪除檔案和檔案夾。回複者根本沒有想到,他給出的操作流程太繁瑣了,他根本沒有意識到,系統已經提供了直接移動檔案的命令move!
move的使用非常簡單,基本格式為 move A B。在這裡,A表示你想要執行移動操作的檔案或檔案夾,B表示A被移動後儲存的位置,而A可以使用相對路徑,也可以使用絕對路徑,甚至可以使用萬用字元,但是,在move執行移動檔案的功能的時候,B只能是目錄路徑,而不能是檔案路徑——很難想象,你要把a.txt檔案移動到b.txt檔案裡去,作業系統會做何感想。比如:move a.txt d:\test,表示把目前的目錄下的a.txt移動到d:\test目錄下;move c:\test.txt d:\,表示把C盤根目錄下的test.txt檔案移動到D盤根目錄下;move c:\*.txt d:\表示把C盤根目錄下的文字檔移動到D盤根目錄下。
另外,需要特別注意的是:move不能跨分區移動檔案夾。感謝zqz0012005的提醒。
上面已經說過,如果你想把a.txt移動到b.txt檔案裡去,作業系統肯定會很不高興。
如果你確實要這麼幹呢?
move a.txt b.txt!
你會發現,對於你的胡纏蠻搞,作業系統也沒攔著你,它很順從地執行了你的命令,但是,結果並沒有像你所期望的那樣,把a.txt放進b.txt裡面去,而是把a.txt改名為b.txt了。
原來,在 move A B 這樣的命令中,move具備移動檔案(夾)的準系統,還兼有重新命名檔案(夾)的功效,具體起什麼作用,視情況決定:
1、如果A、B同為檔案夾名,則把A移動到B目錄下;
2、如果A為檔案名稱,
① B為檔案夾名的時候,將把A移動到B目錄下;
② B為檔案名稱的時候,將把A重新命名為B;如果B所在的位置為另一目錄,則表示在把A移動到B所在的目錄下的同時,重新命名為B。
一旦你明白了move的這些用法,重新命名檔案的時候,你將會很容易在ren和move之間做取捨:如果只是單純地重新命名檔案,則ren和move任選其一即可,只是move的寫法顯得有點怪異而已;如果在要移動檔案之後,還要重新命名檔案,選擇 move c:\test.txt d:\abc\1.txt 的寫法將一步到位,而先 move c:\test.txt d:\abc 之後,再ren d:\abc\test.txt 1.txt 的寫法將顯得繁瑣,最不可取的做法,是先copy,再del/rd,最後再ren,這是追求代碼至精至簡的人士所不能容忍的鋪張浪費行為。
有時候,move的過程並不會一帆風順,比較常見的情形是:目的地有重名檔案存在,系統找不到指定的檔案。
先說重名檔案的情況。
如果有重名檔案出現,move不會成功,它會很體貼地詢問你:改寫××嗎?(Yes/No/All):其中,××表示目的地的重名檔案。如果選擇Yes,將覆蓋重名檔案;如果選擇No,則放棄move操作;如果選擇All,則在批量move的時候,如果存在同名檔案,將不再詢問是否覆蓋,而是直接覆蓋掉重名檔案。
如果你嫌跳出這個提示資訊很麻煩,而你的真正目的是強行覆蓋所有的重名檔案的話,給move加上個 /Y 的開關,寫成 move /y A B就可以了——在cmd 視窗中,預設情況下,move 是帶 /-y 開關的,也就是預設會出現重名檔案的提示資訊,只不過這個預設開關是可以省略的;而在批處理指令碼中,move 預設帶的是 /y 開關,不會出現重名提示而直接覆蓋同名檔案,和cmd視窗中的情形正好相反。
再來看系統找不到指定檔案的情況。
有時候,你會很奇怪,move A B 的時候,A明明是存在的,為什麼還要不知趣地提醒你:“系統找不到指定檔案”呢?這不是在張口說瞎話嗎?
不過,微軟也挺無辜的:出錯的情形太多了,要我對每一種出錯情形都給出明確具體的原因,我哪有那麼大的神通呀?我們搞技術的也不容易啊,能提醒你找不到指定檔案,我們已經儘力了,您老就多多包涵一下吧。
得了,我們還是自己動手找原因吧。
原來,move沒有dir的神通,它不能夠識別出帶隱藏或系統屬性的檔案,在這些檔案面前,它成了瞎子,不過,這不能說move太無能,而是微軟為了安全起見,限制了很多危險命令對帶有隱藏或系統屬性的檔案進行直接操作——del、ren都是這副德性;而rd命令,則屬於漏網之魚,是個例外,要不然,微軟的系統就不會有打補丁一說了。
如何解決這一難題呢?
沒辦法,只能老老實實地先用attrib命令去掉這些檔案的隱藏或系統屬性,再來move吧。至於在寫批處理的時候,如何判斷哪些檔案需要先attrib之後再move,哪些檔案可以直接move,則不屬於本文要討論的範疇,還請讀者關注論壇的其他相關討論話題。