如何用PowerShell将文件打包为多个独立的50MB上限ZIP文件?
解决方案
下面是一段PowerShell脚本,可递归遍历主文件夹下所有子文件夹的PDF文件,将它们分组打包为多个独立的、单文件大小不超过50MB的ZIP包:
# 配置参数 $sourceFolder = "你的主文件夹路径" $outputPath = "输出ZIP的文件夹路径" $maxSizeMB = 48 # 预留2MB余量,避免压缩后ZIP体积接近或超过50MB限制 $currentZipIndex = 1 $currentSize = 0 $currentFiles = @() # 创建输出文件夹(不存在则自动生成) if (-not (Test-Path $outputPath)) { New-Item -ItemType Directory -Path $outputPath | Out-Null } # 递归获取所有PDF文件 $pdfFiles = Get-ChildItem -Path $sourceFolder -Filter *.pdf -Recurse -File foreach ($file in $pdfFiles) { $fileSizeMB = $file.Length / 1MB # 若当前文件加入后会超出体积上限,先打包当前组文件 if ($currentSize + $fileSizeMB -gt $maxSizeMB) { $zipName = Join-Path $outputPath "Result$currentZipIndex.zip" Compress-Archive -Path $currentFiles.FullName -DestinationPath $zipName -Force # 重置分组状态 $currentZipIndex++ $currentSize = 0 $currentFiles = @() } # 将当前文件加入分组 $currentFiles += $file $currentSize += $fileSizeMB } # 处理最后一组剩余的未打包文件 if ($currentFiles.Count -gt 0) { $zipName = Join-Path $outputPath "Result$currentZipIndex.zip" Compress-Archive -Path $currentFiles.FullName -DestinationPath $zipName -Force }
脚本说明
- 参数配置:修改
$sourceFolder为你的主文件夹路径,$outputPath为ZIP文件的输出目录;设置$maxSizeMB为48MB是因为PDF压缩率较低,预留余量可有效避免压缩后的ZIP超过50MB限制。 - 递归遍历:通过
Get-ChildItem -Recurse自动抓取所有子文件夹下的PDF文件。 - 分组打包逻辑:逐个累加文件体积,当加入下一个文件会超出设定上限时,立即将当前分组的文件打包为独立ZIP,随后重置分组开始新一轮收集。
- 收尾处理:遍历结束后,将剩余未打包的文件单独打包为最后一个ZIP。
7-Zip替代方案
若偏好使用7-Zip(压缩率更高),可将脚本中的打包逻辑替换为以下代码:
# 替换原打包部分的代码 $zipName = Join-Path $outputPath "Result$currentZipIndex.zip" $filePaths = $currentFiles.FullName -join " " Start-Process -FilePath "7za.exe" -ArgumentList "a -tzip `"$zipName`" $filePaths" -Wait -NoNewWindow
注意:需确保7za.exe路径已加入系统环境变量,或在脚本中使用完整路径(例如"C:\Program Files\7-Zip\7za.exe")。
内容的提问来源于stack exchange,提问作者Mattia Bergomi
相关产品推荐
相关产品推荐

