Windows 操作

Windows 複製重要檔案後,怎麼用 SHA-256 清單逐檔確認?

複製專案或交付檔案後,在來源與目的地建立相同格式的 SHA-256 清單,依相對路徑排序比對,找出缺檔、路徑差異與內容不一致。

撰文: ToolboxHub 編輯部 資料查證日期: 5 分鐘閱讀 2229 字

先把檔名、大小與內容驗證分成三件事

複製重要檔案後,應同時比對相對路徑與 SHA-256,不能只看檔名、總容量或「複製完成」訊息。檔名相同而雜湊不同,代表兩邊實際位元組不同;雜湊相同但路徑不同,則仍可能放錯交付位置。

例如要把 D:\Client-Delivery 的合約、設計稿與資料表複製到外接硬碟 E:\Client-Delivery。先請其他人暫停修改來源,等同步與複製程序結束,再分別產生來源和目的地清單。若一邊還在寫入,兩份雜湊取樣時間不同,即使複製本身沒有問題也可能出現差異。

先另建一個不位於這兩棵目錄內的稽核資料夾,例如 C:\FileAudit。清單不能存進來源或目的地裡,否則第二次遞迴掃描會把前一份清單也算成待驗證檔案。也不要一開始就用重新複製、移動或刪除來「修正」差異;第一輪只收集證據。

Microsoft 的 Get-FileHash 文件說明,雜湊是依檔案內容計算,而不是依名稱或副檔名;SHA-256 也是這個 cmdlet 的預設演算法。本文仍明確指定 -Algorithm SHA256,讓兩份清單的條件一眼可查。

用相同的唯讀 PowerShell 規則建立兩份清單

來源與目的地必須使用同一個函式、同一個演算法、同一種相對路徑規則和同一個排序方式。本文命令只讀取檔案並在獨立稽核資料夾建立新文字清單,不會改名、搬移、刪除或重新複製來源檔。

先開啟 PowerShell,執行 $PSVersionTable.PSVersion 確認版本。下列寫法依 Microsoft 的 Windows PowerShell 5.1 與 PowerShell 7.5 Get-FileHash 文件核對,刻意避開只存在於較新 .NET 的相對路徑 API;適用範圍是 Windows PowerShell 5.1 或 PowerShell 7.x。Windows PowerShell 5.1 的支援跟隨 Windows,PowerShell 7 則另行安裝與維護,使用 7.x 時仍應採組織核准且在支援期內的版本。

先貼上這個函式:function New-Sha256Manifest { param([string]$Root,[string]$Output) if (Test-Path -LiteralPath $Output) { throw "Manifest already exists: $Output" }; $resolved=(Resolve-Path -LiteralPath $Root).Path.TrimEnd('\'); Get-ChildItem -LiteralPath $resolved -File -Recurse -ErrorAction Stop | ForEach-Object { $relative=$_.FullName.Substring($resolved.Length).TrimStart('\'); $hash=(Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 -ErrorAction Stop).Hash; '{0}|{1}' -f $relative,$hash } | Sort-Object | Set-Content -LiteralPath $Output -Encoding UTF8 }。

接著為兩邊各執行一次,並使用不會重複的報告名稱:

  • 來源清單:New-Sha256Manifest -Root 'D:\Client-Delivery' -Output 'C:\FileAudit\source-2026-08-25.txt'
  • 目的地清單:New-Sha256Manifest -Root 'E:\Client-Delivery' -Output 'C:\FileAudit\destination-2026-08-25.txt'

函式先用 Resolve-Path 取得明確根目錄,再用 Get-ChildItem -LiteralPath -File -Recurse 列舉檔案。每一行由「相對路徑|SHA-256」組成;Windows 檔名本來就不能包含直線符號 |,因此分隔位置清楚。-ErrorAction Stop 的用途是讓拒絕存取或雜湊失敗直接停止,避免把不完整清單誤當成通過。

根目錄請選實際資料夾,不要直接填 C:\ 或 D:\ 磁碟根目錄。若資料量很大,SHA-256 必須讀完每個檔案,時間主要取決於總位元組數、磁碟與外接介面速度;不要用工作管理員看起來「沒有動」就中途拔除硬碟。

先用 PowerShell 判斷,再用文字比對閱讀小型差異

兩份清單應先檢查行數與機器可讀的差異,再決定是否把內容貼到瀏覽器。執行 (Get-Content -LiteralPath 'C:\FileAudit\source-2026-08-25.txt').Count 和目的地版本,若行數不同,至少存在缺檔、額外檔或掃描範圍差異。

接著執行 Compare-Object -ReferenceObject (Get-Content -LiteralPath 'C:\FileAudit\source-2026-08-25.txt') -DifferenceObject (Get-Content -LiteralPath 'C:\FileAudit\destination-2026-08-25.txt')。沒有輸出代表這兩份已排序文字清單逐行一致;有輸出時,<= 指只在來源清單的行,=> 指只在目的地清單的行。這個結果只描述清單,不會自動修復檔案。

清單不大而且不含敏感路徑時,也可把來源貼在左側、目的地貼在右側,用文字差異比對工具的逐行模式閱讀。它只比較貼上的字串並標示新增、刪除或相同行,不能開啟 Windows 資料夾、讀取檔案、計算 SHA-256,也不能證明清單是剛從硬碟產生的。

大型清單不適合直接貼到頁面。現在的文字差異元件使用 LCS 方式比較,資料越長需要的瀏覽器記憶體與計算量越高;先用 PowerShell 縮小差異,再只貼入經授權的少量相關行。若路徑包含客戶姓名、專案代號或內部結構,也應留在組織核准的本機流程中。

依差異類型找原因,不要立刻覆蓋目的地

每一組差異都要先分類成路徑問題、內容問題或掃描失敗,然後回到實際檔案確認。看到紅綠行並不等於知道哪一邊正確,更不代表可以刪除其中一份。

  • 同一相對路徑出現兩個不同 SHA-256 時,先關閉可能仍在儲存的應用程式,再對這一對檔案各跑一次 Get-FileHash -LiteralPath '完整路徑' -Algorithm SHA256。若仍不同,向內容擁有者確認正確版本後,再依核准流程重複複製。
  • 只有來源行時,可能是目的地缺檔,也可能是目的地用了另一個相對路徑或檔名。先用檔案總管搜尋,不要只看資料夾最上層。
  • 只有目的地行時,可能是舊交付物、臨時檔或來源後來移除的檔案。不要把「多出來」直接解讀成「可刪除」。
  • PowerShell 曾顯示拒絕存取、檔案使用中或路徑錯誤時,該輪清單不能判定完整。修正權限或讓擁有者關閉檔案後,換新的清單檔名重新產生。

SHA-256 驗證的是取樣當時的位元組,不會判斷合約版本是否獲准、試算表數字是否正確、PDF 能否正常開啟,或惡意內容是否安全。即使兩份清單一致,仍要依交付清單開啟代表性檔案,並確認檔案數、資料夾結構與實際用途。

用可重現的驗收紀錄結束這次複製

驗收完成時,應保留兩份清單、產生時間、根目錄與處理過的差異說明。只有清單行數一致、逐行比對無差異、掃描沒有錯誤,而且抽查檔案可由原本應用程式開啟,才把這次複製標記為已驗證。

清單檔本身也需要放在適當位置並依保留政策管理,因為相對路徑可能透露專案結構。若之後又修改、同步或重複複製任何檔案,原清單只能證明舊時間點;請用新日期產生另一組,不要覆寫舊證據。

若要把少量差異交給他人檢查,可整理成 CSV 後用CSV / Excel 線上預覽工具查看欄列,但這個工具同樣只解析選取的報告。它不會回到檔案系統驗證位元組,也不會替你重新複製失敗檔案。

常見問題

檔名和檔案大小都一樣,還需要 SHA-256 嗎?

重要交付仍值得計算。名稱和大小相同只能縮小疑點,無法證明每個位元組一致;Get-FileHash 是依內容計算,可把這一層差異顯示出來。

兩個 SHA-256 相同,就能刪除來源嗎?

不能只靠這個結果決定。相同雜湊證明取樣時內容一致,但不涵蓋備份政策、保留期限、目的地後續損壞、版本核准或檔案用途;刪除應走另外的資料治理流程。

為什麼相同檔案在清單裡仍顯示不同?

先看直線符號左邊的相對路徑。檔案被移到不同子資料夾或改名時,即使 SHA-256 相同,整行仍會不同;這正好能抓出內容相同但交付位置不對的情況。

這個流程可以在 Windows PowerShell 5.1 執行嗎?

可以,本文使用 5.1 與 7.5 文件都有的基本 cmdlet 和參數。若公司裝置限制腳本、外接硬碟或檔案讀取權限,先請管理員確認核准做法,不要以提高權限或 -Force 掩蓋未掃描範圍。

ToolboxHub 會直接讀取檔案並計算 SHA-256 嗎?

不會。文字差異工具只比較貼上的清單,CSV 預覽只顯示選取的報告;真正的檔案列舉與位元組雜湊由你在 Windows PowerShell 或 PowerShell 中完成。

參考資料