⚡ 站長快讀:核心重點
- 文章屬性:教學實戰(Windows 自動化備份)
- 適用系統:Windows 10 / 11(robocopy、工作排程器、PowerShell 皆系統內建)
- 難易度 / 耗時:⭐⭐⭐(涉及檔案覆寫,先測試)/ 約 30 分鐘
- 核心結論:把 robocopy 備份寫成 PowerShell 腳本、用工作排程器定時執行,再用結束代碼(≥8 才算失敗)判斷成敗,就能全自動備份並自動回報。
- 適用對象:想讓重要資料夾每天自動備份、又要在出錯時收到訊號的人
📌 快速答案
一句話答案:設定 PowerShell 定時備份,就是把 robocopy 備份寫成
.ps1腳本,再用工作排程器呼叫powershell.exe定時執行,並靠結束代碼判斷成功或失敗、自動留下紀錄。
🧰 開始前的準備
- 系統需求:Windows 10 或 Windows 11(robocopy、工作排程器、Windows PowerShell 5.1 皆為系統內建)
- 權限需求:備份自己的使用者檔案 → 一般使用者即可;要「不論登入與否都執行」或存取受保護位置 → 需系統管理員設定排程
- 需要工具:系統內建的 Windows PowerShell、工作排程器、robocopy;一個備份目的地(外接硬碟 / NAS / 另一顆磁碟)
- 預計耗時:約 30 分鐘
- 難度門檻:需要看得懂並會編輯
.ps1檔;會用工作排程器建立基本工作更好
🔍 為什麼你需要這個?
你有沒有一種備份習慣,是「想到才手動複製一次」?人腦最不可靠的地方就是「想到」——真正需要備份的那天,往往就是你最忙、最不會想到的那天。市面上當然有現成的備份軟體,但它們常常綁自家雲端、免費版限制多,或者你根本搞不清楚它到底把檔案放到哪裡去了。其實 Windows 自己就有一套夠用又透明的組合:用內建的 robocopy 做實際的檔案複製、用 PowerShell 包一層邏輯判斷、再交給工作排程器定時觸發,三個都是系統內建、不裝任何第三方軟體,就能做出每天自動跑、還會告訴你成不成功的備份。
這篇不是要教你 robocopy 有哪些參數(那屬於備份策略),而是把重點放在自動化與可觀測性這兩件最容易被忽略的事:怎麼讓腳本自己判斷成功或失敗、怎麼排程才不會「跑了卻沒作用」、以及最惱人的——排程明明跑完了,工作排程器卻顯示一個看起來很像出錯的「0x1」,到底是不是壞了。先說結論:多半不是。至於該備份哪些資料夾、要不要遵守 3-2-1 原則、robocopy 的鏡像鐵律,那些「備份策略」層面的觀念,建議搭配站上的〈SSD 壽命與「不死資料」備份鐵律(robocopy 實戰)〉一起看。
🛠️ 實戰步驟
⚠️ 動手前先看:本篇腳本會實際複製、覆寫檔案。第一次測試務必先用「模擬模式」(下方步驟一會示範
/L參數)確認來源、目的地都沒填錯,再拿掉模擬正式跑。特別是 robocopy 的/MIR鏡像參數會刪除目的地多出來的檔案,填錯路徑等於清空一個資料夾,務必看到步驟一的紅字警告再用。備份目的地建議是外接或另一顆實體磁碟,別備份到同一顆硬碟(同一顆壞了就一起陪葬)。
步驟一:先把備份寫成一個 PowerShell 腳本
自動化的第一步,是把「要做的事」變成一個檔案。打開記事本或 VS Code,把下面內容存成 C:\Scripts\Backup.ps1(資料夾不存在就自己建一個)。這支腳本做三件事:呼叫 robocopy 複製、把過程寫進 log、再依 robocopy 的結束代碼判斷到底成不成功。
# 每日備份腳本 Backup.ps1
# 用途:把來源資料夾以 robocopy 同步到備份目的地,並記錄結果
# --- 請改成你自己的路徑 ---
$Source = "C:\Users\Ted\Documents"
$Dest = "E:\Backup\Documents"
$LogDir = "C:\Users\Public\Documents\BackupLogs"
# 確保 log 資料夾存在
if (-not (Test-Path $LogDir)) {
New-Item -ItemType Directory -Path $LogDir | Out-Null
}
# 用時間戳記當 log 檔名
$Stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$LogFile = Join-Path $LogDir "backup_$Stamp.log"
# 執行 robocopy:/E 連同子資料夾與空資料夾一起複製,不刪除目的地既有檔案
# /Z 可中斷續傳、/R:2 失敗重試 2 次、/W:5 每次間隔 5 秒、/NP 不印進度百分比
robocopy $Source $Dest /E /Z /R:2 /W:5 /NP /LOG+:$LogFile
$code = $LASTEXITCODE💡 為什麼要這樣做? robocopy 是 Windows 內建、專門做資料夾同步的工具,比檔案總管複製更耐用(可續傳、可重試)。這裡刻意只用
/E不用/MIR——/E只會新增與更新,不會刪東西;/MIR(鏡像)則會把目的地「多出來」的檔案刪掉,威力大但也最容易誤傷。新手先用/E最安全。
第一次測試,先加上 /L 模擬,robocopy 只會列出「打算複製哪些檔案」而不真的動手,拿來驗證路徑最保險:
# 模擬模式:只列出會做什麼,不實際複製或刪除
robocopy $Source $Dest /E /L步驟二:讓腳本自己判斷成功或失敗
上面的 $code 是這整篇最關鍵的一行。robocopy 的結束代碼不是「0 才算成功」,它是一組位元旗標(bitmask):0 代表來源與目的地本來就一致、沒東西要複製;1 代表有檔案成功複製;2 代表偵測到目的地有多餘檔案;3 就是 1+2。0 到 7 全都算成功,8 以上才是真正的錯誤。所以正確的判斷方式是「代碼是不是 ≥ 8」,而不是「是不是非 0」。把這個判斷補到腳本最後:
# robocopy 結束代碼:0-7 = 成功,8 以上 = 失敗
if ($code -ge 8) {
$msg = "備份失敗(robocopy 代碼 $code),請看 log:$LogFile"
Add-Content $LogFile "`n[ERROR] $msg"
# 讓工作排程器看到「失敗」:回傳非 0
exit 1
} else {
Add-Content $LogFile "`n[OK] 備份完成,robocopy 代碼 $code"
# 成功就統一回傳 0,避免工作排程器把 robocopy 的 1 誤判成錯誤
exit 0
}💡 為什麼要這樣做? 因為工作排程器會把腳本(或程式)的結束代碼原封不動記成「上次執行結果」。如果你直接排 robocopy,它成功複製檔案時回傳 1,排程紀錄就會出現一個十六進位的 0x1,看起來很像出錯,其實好得很。用 PowerShell 包一層、成功就
exit 0,排程紀錄才會乾乾淨淨顯示 0x0。這個「0x1 之謎」我們在後面的〈底層機制〉還會拆一次。
步驟三:用工作排程器把腳本排成定時執行
腳本寫好了,接下來交給工作排程器定時觸發。按 Win + R → 輸入 taskschd.msc → Enter 打開工作排程器,右側點「建立基本工作」,照精靈走:
- 名稱:例如
每日文件備份。 - 觸發程序:選「每天」,設一個電腦通常開著的時間(例如凌晨 2:00,或你午休的時段)。
- 動作:選「啟動程式」。這一步最容易填錯,務必照下面填:
- 程式或指令碼:
powershell.exe - 新增引數(選用):
-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\Backup.ps1"
- 完成後,在該工作上按右鍵 → 內容,勾選「不論使用者登入與否均執行」與(如需存取受保護位置才勾)「以最高權限執行」。
工作排程器的完整介面、每個欄位的意義、以及 schtasks 一行指令建排程的做法,站上有專篇〈Windows 工作排程器教學:讓電腦定時自動幫你跑程式、備份、腳本〉,對介面不熟的可以先看那篇打底,本文只聚焦備份這個情境。
💡 為什麼引數要這樣填?
-File指定要跑的腳本;-ExecutionPolicy Bypass讓這次執行忽略系統的指令碼執行原則(否則預設原則常會擋下未簽章腳本);-NoProfile不載入使用者設定檔,啟動更快也更乾淨;-WindowStyle Hidden讓它背景安靜跑、不跳黑視窗。這是微軟與各大 IT 站台公認的排程 PowerShell 標準寫法。
步驟四:更進階——用 PowerShell 一鍵註冊排程
如果你想連「建立排程」這件事也自動化(例如換電腦要一次佈署),可以完全不碰 GUI,直接用 PowerShell 的 ScheduledTasks 模組把上面那個排程用指令建出來:
# 定義動作:呼叫 powershell.exe 跑備份腳本
$Action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument '-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\Backup.ps1"'
# 定義觸發:每天凌晨 2 點
$Trigger = New-ScheduledTaskTrigger -Daily -At 2:00am
# 定義執行身分:S4U = 不論登入與否都跑,且不用存密碼
$Principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType S4U -RunLevel Limited
# 其他設定:錯過時間就在可用時補跑
$Settings = New-ScheduledTaskSettingsSet -StartWhenAvailable註冊指令另外一行下(避免與上面的定義擠在一起),讓它正式登記到排程庫:
Register-ScheduledTask -TaskName "每日文件備份" -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings -Description "每日以 robocopy 自動備份 Documents"💡 為什麼要這樣做? GUI 適合設一台,
Register-ScheduledTask適合「可重現」——腳本存起來,任何一台機器貼上去就長出一模一樣的排程,這正是自動化的精神。-LogonType S4U讓工作不論你有沒有登入都會跑、又不必在系統裡存明碼密碼;要提醒的是,這種「不存密碼」的登入方式實務上常常拿不到存取網路資源的憑證,所以如果你的備份目的地是 NAS 或網路磁碟機、而不是本機的外接碟,建議改用-LogonType Password並提供帳密會比較穩。
步驟五:驗證結果與「失敗會通知你」
排程建好後,在工作排程器裡選中那個工作、按右鍵「執行」手動觸發一次,然後:
- 看「上次執行結果」是不是
0x0(照步驟二的寫法,成功一律 0x0)。 - 去
C:\Users\Public\Documents\BackupLogs打開最新的 log,確認 robocopy 真的有動作。 - 去目的地資料夾,確認檔案真的到了。
至於「失敗時怎麼收到通知」,這是自動備份最該補、卻最多人漏掉的一環。工作排程器早年內建的「傳送電子郵件」動作,微軟已經標為淘汰(deprecated)、不建議再用;而 PowerShell 的 Send-MailMessage 指令,官方後來也標註「不保證與 SMTP 伺服器的安全連線」、不建議用於新專案。所以與其寄信,更務實的做法有三種:
- 最低成本、零依賴——寫 Windows 事件記錄:在腳本失敗那段,用
Write-EventLog記一筆自訂事件(來源需先以系統管理員用New-EventLog註冊一次)。這麼做的好處是,你可以再建一個「當發生某事件時」觸發的排程,一旦備份寫入錯誤事件,就自動跳出訊息或跑通知腳本——純內建、可稽核。 - 要即時推播——用 Webhook:很多聊天服務(如 Microsoft Teams、Slack、Discord)都提供傳入 Webhook,腳本失敗時用
Invoke-RestMethod打一則訊息過去,手機馬上收到。 - 要桌面通知:可裝第三方的 BurntToast 模組跳 Windows 快顯通知(toast),適合單機自用。
🔬 底層機制:那個「0x1」到底是什麼?
這是本篇對一般備份教學的「加值區塊」。很多人第一次把備份排進工作排程器,跑完看到「上次執行結果:(0x1)」就慌了,以為備份壞掉。真相是:工作排程器只是忠實地把它所執行程式的「結束代碼」記下來,而 robocopy 的結束代碼設計得跟一般程式不一樣。
一般程式的慣例是「0 成功、非 0 失敗」。但 robocopy 用的是位元旗標:第 0 位(值 1)代表「有複製到檔案」、第 1 位(值 2)代表「有偵測到多餘檔案」、第 2 位(值 4)代表「有不符 / 不匹配」、第 3 位(值 8)以上才代表「複製失敗」。所以一次成功且真的搬了新檔案的備份,結束代碼就是 1——在工作排程器眼中顯示成十六進位的 0x1。它不是錯誤,它是 robocopy 在說「我有做事喔」。
這也是為什麼步驟二要用 PowerShell 包一層:我們攔下 robocopy 的原始代碼,自己判斷「≥ 8 才算失敗」,成功就對外統一回報 exit 0。這樣工作排程器的紀錄才會顯示 0x0、你也不用每天被一個假的 0x1 嚇一跳。如果你想深入研究工作排程器其他常見的 Last Run Result 代碼(例如 0x1 在別的情境下代表什麼、0x41301「執行中」等),前面提到的工作排程器專篇有一整段對照表可查。
🔙 萬一翻車:回退步驟
備份腳本本身是「加法」(複製檔案),風險比改系統低,但仍有幾個經典翻車情境,先講好怎麼救:
情境一:目的地被 robocopy /MIR 誤刪
如果你(或你抄來的腳本)用了 /MIR 鏡像參數,而來源路徑填錯或指到空資料夾,robocopy 會忠實地把目的地「同步成跟來源一樣空」——也就是刪光。這也是本篇一路強調先用 /E、第一次先加 /L 模擬的原因。萬一真的誤刪:立刻停止該磁碟的一切寫入,用檔案救援工具(如 Recuva、PhotoRec)嘗試救回;若目的地本身也有更早的備份版本或雲端同步,從那裡還原。這說明了為什麼「單一鏡像」不該是你唯一的一份備份。
情境二:排程設了卻沒執行
常見原因:①動作的「程式或指令碼」誤把整串引數也塞進去了(正確是程式只填 powershell.exe,其餘放「新增引數」欄);②勾了「不論使用者登入與否」但沒提供正確帳密 / 或該帳號沒有「以批次工作登入」權限;③電腦在排定時間是關機或睡眠。逐項對照修正,並在工作內容的「設定」頁勾「盡快啟動已錯過的排程工作」。工作排程器各種「跑了卻沒作用」的排錯,同樣可參考工作排程器專篇。
情境三:腳本執行原則擋下、或路徑含空白
若手動雙擊 .ps1 沒反應,多半是執行原則;本文的排程寫法已用 -ExecutionPolicy Bypass 規避。若腳本或路徑含空白,務必用雙引號把 -File "C:\...\Backup.ps1" 的路徑包起來,否則會被截斷成兩段而找不到檔案。
💡 總結:進階玩法與底層邏輯
站長我會把「自動備份」拆成三個彼此獨立的問題來看:搬什麼、怎麼搬、怎麼知道搬成功。多數教學只講「怎麼搬」(robocopy 參數),但真正讓備份「可靠」的,是後面兩件事。這篇刻意把重心放在「用結束代碼判斷成敗」與「失敗要有訊號」,因為一個沒人看、也不會回報的備份,跟沒有備份其實差不多——你會一直以為有,直到需要的那天才發現它三個月前就默默失敗了。
幾個務實的進階建議:第一,永遠先跑 /L 模擬再正式跑,尤其是任何含 /MIR 的腳本,這個習慣能幫你擋掉九成的災難。第二,別把備份放在同一顆實體磁碟;robocopy 幫你防的是誤刪與檔案毀損,防不了整顆硬碟報銷。第三,備份策略上,單一份自動同步只是「3-2-1 原則」裡的一環,重要資料仍建議至少一份離線或異地副本——這部分的觀念,站上那篇 robocopy 備份鐵律講得比較完整。至於 PowerShell 本身還不熟的讀者,可以從〈PowerShell 入門教學:非工程師也能用的 10 個實用指令〉開始,再回頭看這篇會更順。
最後提醒一句老話:備份不是設好就沒事,是要偶爾去確認它還活著。每隔一段時間打開 log、甚至實際還原一個檔案試試,才知道這套自動化是真的在保護你,而不是在演戲。
❓ 常見問題
Q:排程明明跑完了,工作排程器卻顯示「上次執行結果 0x1」,是失敗嗎?
多半不是。robocopy 只要有成功複製到檔案就回傳 1,而 0 到 7 都算成功、8 以上才是錯誤。工作排程器把這個 1 記成 0x1,看起來像出錯而已。照本文步驟二用 PowerShell 判斷「≥ 8 才失敗」、成功時 exit 0,紀錄就會顯示 0x0。
Q:一定要系統管理員才能設嗎?一般使用者可以嗎?
備份你自己的使用者檔案(如 Documents)到你有權限的磁碟,一般使用者就能設、也能排程。只有在你要「不論登入與否都執行」需要特定登入權限、或要備份受系統保護的位置時,才需要系統管理員介入。
Q:robocopy 的 /MIR 會不會把我目的地的檔案刪掉?
會。/MIR(鏡像)會讓目的地與來源完全一致,來源沒有的檔案,在目的地會被刪除。這威力很適合維持精準同步,但也最容易因路徑填錯而誤刪。第一次務必先加 /L 模擬、確認無誤再拿掉;新手備份建議先用只增不刪的 /E。
Q:這個方法在舊版 Windows 也適用嗎?
適用。robocopy 從 Windows Vista 起就是系統內建,工作排程器與 Windows PowerShell 5.1(含 ScheduledTasks 模組)在 Windows 10 / 11 都內建。若你用 PowerShell 7,腳本邏輯一樣通,但 New-EventLog / Write-EventLog 這兩個寫事件記錄的指令只在 Windows PowerShell 5.1 有,PS7 需改用 New-WinEvent 或 eventcreate。
📎 參考資料來源
📖 第一級|廠商官方:
- Microsoft Learn:Robocopy 公用程式使用的傳回碼 — 2026-07-19 查證
- Microsoft Learn:robocopy 指令參考 — 2026-07-19 查證
- Microsoft Learn:Register-ScheduledTask(ScheduledTasks 模組) — 2026-07-19 查證
- Microsoft Learn:New-ScheduledTaskAction — 2026-07-19 查證
- Microsoft Learn:about_Execution_Policies — 2026-07-19 查證
📖 第二級|權威技術媒體:
- Windows OS Hub:Run PowerShell Script on Schedule with Task Scheduler — 2026-07-19 查證
- SS64:Robocopy Exit Codes — 2026-07-19 查證
⚠️ 本文核心事實以第一級為準,第二級為補充。
📅 本文查證戳記:2026-07-19 依據 Windows 10 / 11 內建 robocopy、工作排程器與 Windows PowerShell 5.1 官方文件撰寫。若你在後續版本遇到步驟失效,歡迎在留言區回報,站長會更新文章。
🔗 延伸閱讀
- 教學:Win10 / Win11 如何備份還原系統?內建系統備份還原功能完整指南
- SSD 放著不開機資料會消失?2026 最新 NAND 壽命保存指南(附 PowerShell 巡檢腳本)
- Windows 11 登錄檔備份與還原完整教學 2026|防當機必學救命招
- Python 自動化第一課:批次改檔名、自動整理資料夾一次學會