首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

PowerShell 腳本快速分割大量 EML 郵件文件

     編輯:Java 相關知識

需求背景

有一個包含約 20GB、4 萬個 EML 文件的目錄,需按每個子目錄 2GB 自動分割成 10 個文件夾。

PowerShell 實現腳本

$scrfile = "d:\test"          # 源文件夾
$directory = 0                # 目標文件夾計數器
$maxSize = 1825361100         # 2GB 字節數 (約 2*1024^3)

while ((dir -Path $scrfile -Filter *.eml).Count -gt 0) {
    $directory++
    New-Item -Path "d:\$directory" -ItemType Directory -ErrorAction Stop
    $length = 0

    dir -Path $scrfile -Filter *.eml | Where-Object {
        $objName = $_.Name
        $_.MoveTo("d:\$directory\$objName")
        $length += $_.Length
        if ($length -gt $maxSize) { return }  # 跳出管道
    }
}

關鍵點解析

  • 管道流式處理:Where-Object 在管道中逐個處理文件,避免一次性載入所有文件對象到內存。
  • 即時移動:MoveTo 直接將文件移動到新目錄,源目錄文件數遞減,while 條件自然結束。
  • 大小累加判斷:變量 $length 累加文件大小,超過閾值時 return 中斷當前管道,外層循環創建下一個目錄。
  • 性能表現:4 萬文件約 2 秒完成分割,得益於 PowerShell 管道流與文件系統操作的高效結合。

避坑指南

  • 不要在管道中使用 foreach,它會將所有對象先收集到內存再迭代,極其緩慢且佔用大量內存。
  • 確保目標磁盤空間充足,MoveTo 在同分區是元數據操作(極快),跨分區則為複製+刪除。
  • 生產環境建議加入 -WhatIf 參數預演,確認無誤後再執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved