比起滑滑鼠,我更喜歡開DOS視窗敲鍵盤下指令解決問題,效率高,操作程序可以保存並加以優化,成果可反覆使用並散佈供他人使用。當手指飛快在鍵盤上躍動,還有種自己正忙著拯救世界,或是藝術家沈醉在表演中的錯覺 XD

前陣子分享過產生批次指令部署檔案的小工具,在最近上線過程耍得虎虎生風,習得實戰技巧幾則,特筆記備忘。

COPY 三寶

COPY、XCOPY、ROBOCOPY 三者各有無法被取代的特色,視場合使用,俗稱 COPY 三寶(喂!不要亂取名字啦)。完整參數介紹:COPYXCOPYROBOCOPY

複製檔案時如何覆寫被設為唯讀的檔案?

XCOPY 有個 /R 參數,例如:xcopy d:\src\blah\a.js d:\dst\blah\a.js /y /r。(記得還要加上/y,省略確認直接覆寫。

如何找出某個時點之後更新的檔案?

上線程式時若想挑出有更動的檔案,ROBOCOPY 有個好用參數 /xo /maxage,可以搜尋整個目錄挑出指定時間後才更新的檔案,並依原資料夾結構擺放,用它直接對目的資料夾進行覆寫,一個動作完成更新。

例如以下指令可挑出2016/10/01之後有異動的檔案:robocopy d:\WWW\Oasis d:\Set9527\Oasis /MAXAGE:20161001 /XO /S

接下來執行 xcopy d:\Set9527\Oasis \\192.168.1.1\d$\WWW\Oasis /s /y 就可用整個資料夾覆寫目的資料夾,但只更新有異動的檔案。

如何將 DIR 結果轉為檔案清單?

部署指令產生器使用檔案清單跟主機 IP 清單展開成 COPY 指令,要將 DIR 結果轉成文字清單,可使用 PowerShell Get-ChildItem取得檔案物件陣列,從物件FullName屬性取得完整路徑再去除父資料夾部分轉成相對路徑。例如:Get-ChildItem -Path E:\Set9527\Oasis -Recurse –File | % {$_.FullName.Replace("E:\Set9527", "") }

實際應用時,有時 Get-ChildItem 的結果還需加上篩選條件或一些花式變化,透過 Pipeline 串接可以輕易達成。參考

如果想將執行結果複製到剪貼簿,不要再傻傻滑滑鼠選範圍或輸出到檔案再取回,後方用 Pipeline 串接 clip.exe 工具,一次搞定。

[2016-10-16更新] 感謝安德魯補充,dir /b /s 也可快速產生檔名清單,另外 for 也能產生相同結果且功能更強大。

[2016-10-26更新]發現更好用的 forfiles 指令:forfiles /p E:\Set9527\Oasis /s /c "cmd /c echo @relpath"

複製檔案時如何自動建立資料夾?

遇到複製整個資料夾(或以萬用字元指定多檔)而目的路徑不存在時,XCOPY 會詢問目標路徑為檔案還是資料夾:

要避免 XCOPY 詢問,可加上 /i 參數,可指示 XCOPY 自動建立資料夾並複製檔案。 若複製來源為單一檔案便不適用 /i 參數,一定跳出詢問:

最簡單的解法是在目的路徑後方加上一個"\"搞定。


Comments

# by 安德魯

DIR 目錄轉成清單,有簡單的做法 DOS 指令: dos /s /b > list.txt /b 是只列出檔名, 不包含任何大小等資訊 /s 是 recursive 不然 for /R %i in (*) do echo %i 也可以做格式的變化.. %i 有各種參數可以用,詳情可查閱 for /?

# by Jeffrey

to 安德魯,竟漏了 /b 這個好東西,感謝補充!已加入本文

# by 擼蛇

如果dos可以commit rockback多好呢 經常寫錯command 然後就刪錯東西了

# by 安德魯

自肥一下,NTFS 也是支援交易的喔.. 以前寫過文章介紹: http://columns.chicken-house.net/2010/03/18/txf-1-%E5%88%9D%E6%8E%A2-transactional-ntfs/ 只是不知有沒有人做成指令,可以在 DOS or Powershell 處理完之後下達 commit or rollback ... XDD

Post a comment