比起滑滑鼠,我更喜歡開DOS視窗敲鍵盤下指令解決問題,效率高,操作程序可以保存並加以優化,成果可反覆使用並散佈供他人使用。當手指飛快在鍵盤上躍動,還有種自己正忙著拯救世界,或是藝術家沈醉在表演中的錯覺 XD
前陣子分享過產生批次指令部署檔案的小工具,在最近上線過程耍得虎虎生風,習得實戰技巧幾則,特筆記備忘。
COPY 三寶
COPY、XCOPY、ROBOCOPY 三者各有無法被取代的特色,視場合使用,俗稱 COPY 三寶(喂!不要亂取名字啦)。完整參數介紹:COPY、XCOPY、ROBOCOPY。
複製檔案時如何覆寫被設為唯讀的檔案?
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 也能產生相同結果且功能更強大。
複製檔案時如何自動建立資料夾?
遇到複製整個資料夾(或以萬用字元指定多檔)而目的路徑不存在時,XCOPY 會詢問目標路徑為檔案還是資料夾:
要避免 XCOPY 詢問,可加上 /i 參數,可指示 XCOPY 自動建立資料夾並複製檔案。 若複製來源為單一檔案便不適用 /i 參數,一定跳出詢問:
最簡單的解法是在目的路徑後方加上一個"\"搞定。