快訊
2026-07-19
腳本自動化

PowerShell 定時備份:用工作排程器打造全自動備份

約 13 分鐘閱讀

⚡ 站長快讀:核心重點

  • 文章屬性:教學實戰(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 打開工作排程器,右側點「建立基本工作」,照精靈走:

廣告
  1. 名稱:例如 每日文件備份
  2. 觸發程序:選「每天」,設一個電腦通常開著的時間(例如凌晨 2:00,或你午休的時段)。
  3. 動作:選「啟動程式」。這一步最容易填錯,務必照下面填:
  • 程式或指令碼:powershell.exe
  • 新增引數(選用):-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\Backup.ps1"
  1. 完成後,在該工作上按右鍵 → 內容,勾選「不論使用者登入與否均執行」與(如需存取受保護位置才勾)「以最高權限執行」。

工作排程器的完整介面、每個欄位的意義、以及 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 並提供帳密會比較穩。

步驟五:驗證結果與「失敗會通知你」

排程建好後,在工作排程器裡選中那個工作、按右鍵「執行」手動觸發一次,然後:

  1. 看「上次執行結果」是不是 0x0(照步驟二的寫法,成功一律 0x0)。
  2. C:\Users\Public\Documents\BackupLogs 打開最新的 log,確認 robocopy 真的有動作。
  3. 去目的地資料夾,確認檔案真的到了。

至於「失敗時怎麼收到通知」,這是自動備份最該補、卻最多人漏掉的一環。工作排程器早年內建的「傳送電子郵件」動作,微軟已經標為淘汰(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 在說「我有做事喔」。

robocopy 結束代碼判讀圖:0 代表已同步、1 代表有檔案成功複製屬成功、2–3 代表偵測到多餘檔案、8 以上才是真正失敗

這也是為什麼步驟二要用 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-WinEventeventcreate


📎 參考資料來源

📖 第一級|廠商官方:

📖 第二級|權威技術媒體:

⚠️ 本文核心事實以第一級為準,第二級為補充。

📅 本文查證戳記:2026-07-19 依據 Windows 10 / 11 內建 robocopy、工作排程器與 Windows PowerShell 5.1 官方文件撰寫。若你在後續版本遇到步驟失效,歡迎在留言區回報,站長會更新文章。


🔗 延伸閱讀


廣告