🍀【Windows 批次檔教學】如何每月自動搬移舊資料?完整實戰(含安全機制與排程)

🧠 前言(給完全不懂的人)

在企業系統或資料處理流程中,常常會遇到一個問題:

👉 資料一直累積,資料夾越來越大

例如:

  • 測試數據(STDF)
  • Log 檔
  • 報表資料

如果不定期整理,可能會導致:

  • 磁碟爆滿
  • 系統變慢
  • 備份時間變長

所以我們需要一個自動機制:

✅ 每個月自動把「舊資料」搬走


🎯 本篇要解決的問題

我們要做到:

✅ 每月自動執行
✅ 搬移「2 個月前」的資料
✅ 安全(避免誤刪)
✅ 有紀錄(log)
✅ 可先預覽再執行


⚙️ 核心概念(先理解再寫程式)

你可以把整個流程想成:

現在時間:2026/03

找出:2026/01 以前的資料

搬到:舊資料資料夾

記錄搬了什麼

🧩 Step 1:建立自動搬移腳本(核心程式)

📄 PowerShell 腳本(move_old_data.ps1)

# 設定來源與目標資料夾
$sourcePath = "Z:\Data\Current"
$archivePath = "Z:\Data\Archive"

# 設定時間條件(2個月前)
$thresholdDate = (Get-Date).AddMonths(-2)

# 是否為測試模式(true = 不搬移)
$previewMode = $true

# 建立 log 檔
$logFile = "D:\Logs\data_move_$(Get-Date -Format 'yyyyMMdd_HHmm').log"

function Write-Log($message) {
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$text = "[$time] $message"
$text | Out-File -Append -FilePath $logFile
Write-Host $text
}

Write-Log "開始執行資料搬移任務"

# 取得符合條件的資料
$files = Get-ChildItem $sourcePath

foreach ($file in $files) {

if ($file.CreationTime -lt $thresholdDate) {

$destination = Join-Path $archivePath $file.Name

if ($previewMode) {
Write-Log "【預覽】將搬移:$($file.FullName)"
}
else {
try {
Move-Item $file.FullName $destination -Force
Write-Log "已搬移:$($file.Name)"
}
catch {
Write-Log "錯誤:$($_.Exception.Message)"
}
}
}
}

Write-Log "任務完成"

🔍 重點說明(簡單講)

這段程式做了 4 件事:

1️⃣ 找出 2 個月前的資料

(Get-Date).AddMonths(-2)

👉 就是「往前推兩個月」


2️⃣ 判斷是否要搬

$file.CreationTime -lt $thresholdDate

👉 只有舊資料才處理


3️⃣ Dry Run(超重要)

$previewMode = $true

👉 開發或第一次執行時用
👉 只顯示,不真的搬


4️⃣ 寫 Log

👉 每次執行都有紀錄
👉 出問題可以追蹤


🧨 常見錯誤(一定要看)

❌ 1. 用 Z 槽但排程抓不到

👉 很多公司排程沒有掛網路磁碟

✅ 建議改成:

\\ServerName\Folder

❌ 2. 搬到一半資料還在寫入

👉 會造成檔案損毀

✅ 解法:

  • 只搬「最後修改超過 10 分鐘」的檔案

❌ 3. 不小心全刪

👉 超危險

✅ 解法:

  • 一定先用 previewMode
  • 不要用 Remove-Item

⏰ Step 2:設定排程(自動化)

使用 Windows 任務排程:

設定方式:

  1. 開啟「工作排程器」
  2. 建立基本工作
  3. 觸發:
    • 每月 1 號
    • 凌晨 2 點
  4. 動作:

    powershell.exe -File D:\Scripts\move_old_data.ps1

🚀 進階優化(工程師必做)

✅ 加鎖(避免同時執行)

避免兩個排程同時跑


✅ 分批搬移

例如:
👉 一次搬 10 個檔案


✅ 限制記憶體(Java系統)

如果你有搭配 Java:

java -Xmx1024m -jar yourApp.jar

📊 最終效果

執行後你會得到:

📁 Current
↓(舊資料被搬走)
📁 Archive
↑(累積歷史資料)

📄 Logs
✔ 每次都有紀錄

🎯 結論

這套做法可以幫你達到:

✅ 自動整理資料
✅ 不影響系統運作
✅ 降低風險(有 log + 預覽)
✅ 適用銀行 / 半導體 / 大量資料環境

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

如何在 Word 插入漂亮的程式碼區塊—使用Editor.md