Windows 操作

合併兩個 Windows 資料夾前,先找出同名檔案與完整路徑

合併 Windows 交付資料夾前,先用唯讀 PowerShell 清單找出同名檔案,匯出完整相對路徑與大小,再逐組判斷保留、改名或停止合併。

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

先把「同名」當成碰撞候選,不要當成重複檔案

合併兩個 Windows 資料夾前,應先列出兩邊所有同名檔案的來源、相對路徑與大小,暫時不要移動、覆蓋或刪除任何項目。同名只能證明名稱會碰撞,不能證明兩份內容相同。

例如設計團隊與業務各交來一個資料夾,兩邊都有 final.pdf、cover.jpg 與 notes.txt。設計資料夾的 final.pdf 可能是印刷版,業務資料夾的同名檔卻是客戶確認版;直接拖曳合併時,Windows 的取代提示無法替你判斷哪一份才該保留。

先保留兩個來源資料夾不動,另建一個只放檢查報告的空資料夾。若來源位於 OneDrive、網路磁碟或多人共用位置,先請其他人暫停變更,並記下開始檢查的時間。這個流程只建立清單,不執行合併;真正搬移前仍要依組織的備份與交付規則保留回復點。

用唯讀 PowerShell 收集名稱、來源與相對路徑

先用 Get-ChildItem 遞迴讀取兩個明確路徑,再把每個檔案整理成同一種記錄。Microsoft Learn 的 Windows PowerShell 5.1 文件確認 Get-ChildItem 支援 -LiteralPath、-File 與 -Recurse;本文只使用查詢語法,也適用於 PowerShell 7.x 的相同參數。

先從開始功能表搜尋 PowerShell 或在 Windows Terminal 開啟 PowerShell。把下列示例路徑換成實際來源,而且路徑尾端不要加反斜線:

  • 設定兩個來源:$roots = @('D:\Delivery-A','D:\Delivery-B')。
  • 建立唯讀記錄:$rows = foreach ($root in $roots) { Get-ChildItem -LiteralPath $root -File -Recurse | ForEach-Object { [pscustomobject]@{ Name = $_.Name; Root = $root; RelativePath = $_.FullName.Substring($root.Length).TrimStart('\'); Bytes = $_.Length; Modified = $_.LastWriteTime } } }。
  • 先確認範圍:$rows | Select-Object -First 10,並查看第一批結果的 Root 與 RelativePath 是否真的指向預定資料夾。

這段命令不包含 Copy-Item、Move-Item、Rename-Item 或刪除命令。若出現拒絕存取,應記下未讀取的子資料夾並停止把報告視為完整清單;不要為了消除錯誤就改用系統管理員權限或 -Force 擴大範圍。

依檔名分組,只匯出可能碰撞的記錄

同名候選可用 Group-Object 依 Name 分組,再保留數量大於一的群組。Microsoft Learn 說明 Group-Object 會依指定屬性建立群組並提供數量;這裡的用途只是縮小人工檢查範圍。

先執行 $collisions = $rows | Group-Object -Property Name | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group }。接著準備一個已存在的報告資料夾,使用不會覆蓋舊報告的檔名匯出:$collisions | Sort-Object Name, Root, RelativePath | Export-Csv -LiteralPath 'D:\Review\filename-collisions-2026-08-17.csv' -Encoding UTF8 -NoTypeInformation -NoClobber。

Export-Csv 會把物件屬性寫入另一個 CSV 檔。本文保留 -NoTypeInformation,讓 Windows PowerShell 5.1 不加入型別標頭;-NoClobber 則在同名報告已存在時停止,而不是悄悄覆寫。PowerShell 7 的選單入口可能和 Windows PowerShell 5.1 不同,但這些命令不依賴特定終端介面。

報告為空時,也不能立刻斷言兩個資料夾安全可合併。先確認 $rows.Count 合理、沒有拒絕存取,而且兩個根目錄都有資料;大小寫不同的名稱、過長路徑與目的地檔案系統規則也要依實際交付環境再檢查。

用 CSV 預覽逐組看路徑,不讓工具替你決定版本

CSV / Excel 線上預覽工具適合開啟剛匯出的碰撞報告,搜尋 final.pdf 或 cover.jpg,並把同名項目的來源、相對路徑、位元組大小與修改時間放在一起看。它只預覽報告,不會讀取 Windows 資料夾,也不會移動、覆蓋、改名或刪除來源檔案。

目前預覽器可讀取 CSV、TSV、XLSX 與 XLS,並顯示工作表、搜尋與列欄數;畫面最多呈現 500 筆符合搜尋條件的資料列。搜尋只改變畫面,不是匯出篩選器;按下匯出會另建目前工作表的完整 data.csv,不會只留下搜尋結果,也不會回寫原始報告。

逐組判斷時可採用以下規則:

  • 名稱相同但大小不同,代表內容至少不能只靠名稱視為同一份;分別用原本應用程式開啟並向負責人確認用途。
  • 名稱與大小都相同,仍不能證明位元組完全一致;重要檔案要使用組織核准的檔案雜湊或二進位比較流程。ToolboxHub 的 Hash 頁只計算貼上文字,不是檔案雜湊器。
  • 同名檔位於不同相對路徑時,先確認合併後是否仍會落在不同子資料夾;若目的流程會扁平化目錄,它們依然可能碰撞。
  • 無法判斷哪一份有效時,保留兩份並暫停合併,請內容擁有者決定新名稱與版次,不要用較新的修改時間自動勝出。

決定後再合併,並用第二份清單驗證結果

只有每組碰撞都有明確處置紀錄後,才應在有備份的工作副本進行實際合併。這篇文章不提供自動覆蓋或批次改名命令,因為清單無法替內容擁有者決定哪份合約、設計稿或照片正確。

若決策是保留兩份並改名,必須先保留未變更的備份或建立測試資料夾,寫出「原名 → 新名」對照,並先用 Rename-Item -WhatIf 預覽;確認所有目標名稱沒有碰撞後,才能在副本執行。改副檔名也不是格式轉換,不能用 .docx 改成 .pdf 的名稱來假裝完成轉檔。

合併完成後重新產生檔案清單,核對總數、相對路徑與先前的每一組決策。可把預期清單與合併後清單整理成相同排序,再用文字差異比對工具逐行查看;它只比較貼上的文字,不會開啟檔案或驗證內容。最後仍要抽查代表性的 PDF、圖片與文件,確認應用程式可開啟、版本標示正確,而且來源資料夾仍保留。

常見問題

這些命令可以在 Windows PowerShell 5.1 執行嗎?

可以。檔案列舉部分依 Windows PowerShell 5.1 文件核對,分組與 CSV 匯出使用兩個版本共有的基本語法,並保留 5.1 需要的 -NoTypeInformation。若公司限制 PowerShell 版本或執行原則,應先請管理員確認唯讀清單流程。

檔名和大小都一樣,就能刪掉其中一份嗎?

不能。相同大小不是內容相同的證明,修改時間也可能因複製或同步而改變。先開啟檔案、確認業務用途,重要資料再用核准的位元組雜湊或比較流程驗證。

CSV 預覽搜尋後匯出,會只留下碰撞的那幾列嗎?

不會。搜尋只影響目前畫面;預覽器的匯出使用目前工作表的完整資料。本文已在 PowerShell 階段只匯出碰撞候選,因此不要把頁面搜尋當成第二次篩選。

這個流程需要 -WhatIf 嗎?

列舉、分組與匯出報告不會改名,所以沒有 Rename-Item 可預覽。若後續真的要批次改名,則必須保留備份或測試資料夾,先執行含 -WhatIf 的改名命令,再考慮於副本執行。

ToolboxHub 可以直接合併兩個 Windows 資料夾嗎?

不可以。CSV 預覽只查看匯出的報告,文字差異比對只比較貼入的清單;實際的檔案判斷、備份、改名、搬移與合併都在使用者的 Windows 環境完成。

參考資料