先決定「哪一天幾點之後」,再找最近修改檔案
交付前可以用 PowerShell 依修改時間列出待複核檔案,但要指定資料夾、時間界線與時區,並把結果和完整交付名單核對。最近修改不等於應交付:上週定稿的授權書仍可能是必要附件。
例如週五交設計專案,週三上午九點後有人更新說明與圖片。這次要回答的是「凍結版本後,哪些項目需要再看一次」,而不是找同名檔案,也不是驗證複製後的檔案位元組。先保留來源資料夾及原有備份,請協作者停止修改,並等同步結束。報告要放在來源樹之外,避免下次把報告自己也列進去。
本文以 Windows 上的 Windows PowerShell 5.1 基本語法為範圍,並核對 PowerShell 7.5 官方文件中的篩選、排序及匯出參數。用 $PSVersionTable.PSVersion 看目前版本;這些查詢不需要以系統管理員身分執行。受管理電腦若禁止 PowerShell,交由管理員依同一篩選條件產生清單,不必更改執行原則。
在明確資料夾中收集一次,再檢查再匯出
先把查詢結果存成陣列,確認沒有錯誤後才匯出新報告。下列每個項目是一條完整命令,請依序執行;示例的來源和報告資料夾必須先存在,並換成你的實際路徑。
- 指定來源:
$sourceRoot = 'C:\DeliveryDemo'。 - 指定本機時間界線:
$cutoff = [datetime]::ParseExact('2026-09-16T09:00:00', 'yyyy-MM-ddTHH:mm:ss', [cultureinfo]::InvariantCulture)。 - 收集候選:
$recentRows = @(Get-ChildItem -LiteralPath $sourceRoot -File -Recurse -ErrorAction Stop | Where-Object { $_.LastWriteTime -ge $cutoff } | Sort-Object LastWriteTime -Descending | Select-Object FullName,Length,@{Name='ModifiedLocal';Expression={$_.LastWriteTime.ToString('yyyy-MM-ddTHH:mm:ss')}})。 - 先看數量與完整路徑:
$recentRows.Count,接著執行$recentRows | Format-List。 - 只有收集成功且有候選列時才執行:
$recentRows | Export-Csv -LiteralPath 'C:\DeliveryAudit\recent-20260918.csv' -NoTypeInformation -Encoding UTF8 -NoClobber。
Get-ChildItem 文件說明如何以實際路徑遞迴列舉檔案;Where-Object負責保留符合條件的物件。這裡的 -ge 包含恰好九點的檔案,Sort-Object則讓較新的候選排在前面。
Length 是位元組數。ModifiedLocal 刻意不帶時區,交付記錄要另註「本機當時使用的時區」;不要把不同電腦的時間清單直接拼在一起。Microsoft 的 LastWriteTime 說明指出它採本機時間,取得的值也可能不精確。這是時間中繼資料查詢,不是版本控制歷程。
Export-Csv把物件欄位寫成清單;-NoClobber 用來避免蓋掉同名報告。不要把 Format-List 的輸出接到匯出命令,應重新從 $recentRows 匯出。若收集時出錯,停止使用這次變數,修正範圍後重跑收集,不要拿先前留下的值繼續交付。
用三個時間樣本確認邊界與順序
可重現的驗收條件是「舊檔排除、界線檔保留、新檔排在前面」。以下是人工設定時間的教學樣本,不是客戶資料或真實交付紀錄:
old.txt修改時間為 2026-09-15 17:00:00,預期不在候選中。boundary.txt修改時間為 2026-09-16 09:00:00,預期列入。latest.txt修改時間為 2026-09-17 14:00:00,預期列入且排第一。
需要重做這個檢查時,先在全新的測試資料夾建立三個文字檔。只對這三個測試檔設定時間,例如 (Get-Item -LiteralPath 'C:\DeliveryDemo\boundary.txt').LastWriteTime = $cutoff;另外兩個時間也以相同的 ParseExact 寫法設定。不要更動真實來源檔的時間來配合篩選。
預期 $recentRows.Count 是 2,順序為 latest、boundary。匯出後執行 @(Import-Csv -LiteralPath 'C:\DeliveryAudit\recent-20260918.csv').Count,應仍是 2。此次編寫時已在 Windows PowerShell 5.1.19041.6456 的隔離樣本執行相同查詢,得到上述順序與兩列 CSV,且三個來源樣本的內容雜湊前後相同;這項觀察不涵蓋你的同步磁碟或實際專案。
用預覽逐件核對,而不是把表格當成交付證明
把新報告交給 CSV / Excel 線上預覽(csv-preview),可搜尋一段路徑、查看欄位,並和 PowerShell 的候選數核對。找到項目後,仍要在 Windows 開啟對應文件,檢查內容、版本標示及是否應加入交付包。
這次檢查的元件會把第一列當表頭,最多顯示 500 筆符合搜尋的資料。清除搜尋再看總數;左側序號是篩選後的位置,不是原始清單行號。匯出按鈕另建目前工作表全部已解析資料的 CSV,不會只留下搜尋結果,也不會編輯來源、移動檔案或製作備份。
完整路徑可能含姓名或客戶名稱。請先確認允許使用瀏覽器工具;元件雖在瀏覽器解析所選檔案,仍需從 jsDelivr 載入解析器,不能把它描述成完全離線。若不適合提供路徑,就留在核准的本機流程檢查。
看不到檔案時,先分辨範圍、權限與時間問題
零筆結果先查路徑和界線,不代表資料夾沒有必要交付檔案。檢查一個已知檔案的 LastWriteTime,也確認子目錄是否位於設定的來源內。這份命令沒有加 -Force,不應宣稱涵蓋隱藏檔;若交付規格需要隱藏設定檔,應另列核准範圍,由負責人補查。
出現拒絕存取時,不要用一張仍能打開的舊 CSV 宣告成功。處理不可讀的資料夾後重跑查詢,再換一個報告名稱。遇到同名報告已存在,保留它並給新報告不同名稱即可,不必移除保護參數。
CSV 無法開啟但 PowerShell 能匯入時,可能是解析器載入遭網路阻擋;使用核准網路或本機工具。最後把每個候選標記為「已納入、刻意排除並記原因、待確認」,再回頭看完整交付名單中的舊附件,才能補上時間篩選的盲點。
常見問題
可以把今天零點當界線嗎?
可以,但只適合你的變更範圍確實從今天開始。跨日工作的專案應用最後一次確認版本的時間,並記錄本機時區。
時間相同就代表檔案內容相同嗎?
不代表。時間清單適合找複核候選,檔案內容一致性仍需另外比較,不能由修改時間推定。
清單只有兩筆,交付包就只放這兩筆嗎?
不一定。較舊但必要的附件不會出現在本次候選中;先看完整交付規格,再決定打包內容。
這裡需要批次改名嗎?
不需要。此流程只列舉和建立報告。若另有改名工作,必須先保留備份,在測試副本上用含 -WhatIf 的命令預覽,再核對後執行。