透過wbadmin CLI指令介面進行Windows系統備份

本來都是透過備份與還原(Windows 7)這個功能來進行我自己的Windows作業系統備份,但因為其管理空間的功能實在是爛到掉渣,無論怎麼設定系統最終一定會將備份目標磁碟的空間占滿(打開來會看到一堆歷史備份紀錄,必須手動刪除),再加上不定時會出現「STATUS_WAIT_1」錯誤,因此我決定把備份策略轉向到wbadmin.exe

透過wbAdmin來進行Windows備份

wbadmin是一個命令行工具,用於在Windows操作系統中進行備份和還原,自Windows Server 2008開始取代了早期Windows使用的ntbackup工具,最大的特色就是可以透過CLI介面操作並且提供指令讓你可以管理備份儲存的版本,支援完整備份和VSS(Volume Shadow Copy Service)副本備份。

由於是CLI且指令充足,讓我得以透過程式碼的方式來控制完成我想要的備份策略。我建立了下列的批次檔案來執行,預設只保留最後2次的備份資料,過久的一律砍掉。如果有想要的人,可以針對下面程式碼中的backupTargetkeepBackups進行調整即可。

請將下列批次檔程式碼儲存成WindowsBackup.bat,由於內容有中文字元,檔案編碼請以ANSI(BIG-5)儲存比較不會出錯。

@echo off

setlocal enabledelayedexpansion

:: 設定備份目標位置
set "backupTarget=D:"
:: 設定要保留的備份數量
set "keepBackups=2"

:: 執行備份命令
wbadmin start backup -backupTarget:"%backupTarget%" -include:C: -allCritical -quiet
echo 備份完成。

:: 列出備份版本
set "count=0"
for /f "usebackq tokens=2" %%I in (`wbadmin get versions -backupTarget:"%backupTarget%" ^| findstr /C:"版本識別碼:"`) do (
    set "fullLine=%%I"
    set "versionID=!fullLine:~0,16!"
    set /a "count+=1"
    set "backup[!count!]=!versionID!"
)
echo 目前總共發現(!count!)個備份版本,系統將掃描是否需要移除舊備份版本...

:: 移除備份版本
if %count% gtr %keepBackups% (
    set /a "deleteCount=count-keepBackups"
    for /l %%J in (1,1,!deleteCount!) do (
        set "oldBackup=!backup[%%J]!"
        wbadmin delete backup -version:!oldBackup! -quiet
    )
) else (
    echo 當前備份數量(!count!)不超過設定保留數量(!keepBackups!)故無需刪除。
)

endlocal

無論是wbadmin.exe或是這隻WindowsBackup.bat批次檔必須以最高管理權限執行,執行後會自動在備份磁碟(例如:D槽)開啟一個WindowsImageBackup資料夾進行備份,你可以把這個批次檔案設定到Windows排程即可達成定期備份的能力。此外,你也可以透過下列指令查看當前的備份情況:

wbadmin get versions

輸出訊息大致上會長得像下列(保留最末2個備份):

wbadmin 1.0 - 備份命令列工具
(C) 著作權 Microsoft Corporation. 著作權所有,並保留一切權利。

備份時間: 2024-07-09 03:00
備份目標: 固定式磁碟 (標籤 本機磁碟(D:))
版本識別碼: 07/08/2024-21:00
可以復原: 磁碟區, 檔案, 應用程式, 裸機復原, 系統狀態
快照識別碼: {6f475a12-5e9f-4d29-af1f-e999b9ae4d5d}

備份時間: 2024-07-10 03:00
備份目標: 固定式磁碟 (標籤 本機磁碟(D:))
版本識別碼: 07/09/2024-21:00
可以復原: 磁碟區, 檔案, 應用程式, 裸機復原, 系統狀態
快照識別碼: {bcf417b1-04c3-48f8-862c-18804c5260c8}

相關連結

WindowsBackup WbAdmin Bat Scripts Schedule Scheduling AutoBackup Delete Remove BackupHistory BackupHistories BackupRecords