PowerShell多文件复制归档及按日期时间命名压缩包实现
PowerShell 多指定文件统一归档压缩实现方案
原有单文件功能逻辑
最初实现的单文件处理流程如下:
- 预设源文件夹路径、待处理单文件名、压缩包存储目标路径
- 将指定单文件从源位置复制到目标存储目录
- 调用压缩命令,将文件按
ddMMyyyy-hh.mm.ss格式的日期时间命名生成zip压缩包 - 压缩完成后删除临时复制的单文件,输出执行结果
对应的单文件实现代码:
$sursa_folder="C:\folder\folder\folder\folder" $sursa_file="file" $dest_folder="F:\+\name\Dump" Copy-Item (Join-Path $sursa_folder $sursa_file) -Destination $dest_folder try { Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ((Join-Path $dest_folder $sursa_file) + (Get-Date).ToString('ddMMyyyy-hh.mm.ss') + ".zip") -ErrorAction SilentlyContinue #Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ("X:\" + (Get-Date).ToString('ddMMyyyy-hh.mm.ss') + ".zip") -ErrorAction SilentlyContinue Remove-Item (Join-Path $dest_folder $sursa_file) -Force -ErrorAction Stop Write-Host "finalizat OK" } catch { write-host "Eroare: $_" } finally { }
无效的多文件尝试说明
为了实现多文件打包,曾尝试直接将多个文件名用引号拼接成字符串赋值给sursa_file变量,执行后完全不生效:
$sursa_folder="C:\folder\folder\folder\folder" $sursa_file="file1""file2""file3""file4""file5""file6""file7" $dest_folder="F:\+\name\Dump" Copy-Item (Join-Path $sursa_folder $sursa_file) -Destination $dest_folder try { Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ((Join-Path $dest_folder $sursa_file) + (Get-Date).ToString('ddMMyyyy-hh.mm.ss') + ".zip") -ErrorAction SilentlyContinue #Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ("X:\" + (Get-Date).ToString('ddMMyyyy-hh.mm.ss') + ".zip") -ErrorAction SilentlyContinue Remove-Item (Join-Path $dest_folder $sursa_file) -Force -ErrorAction Stop Write-Host "finalizat OK" } catch { write-host "Eroare: $_" } finally { }
问题根源:这种字符串拼接的写法会把多个文件名揉成一个不存在的超长文件名,PowerShell做路径匹配时根本找不到对应文件,自然无法执行操作。
最终可用的多文件归档实现
核心思路:在目标路径下创建一个临时中转文件夹,把所有需要打包的文件统一复制到这个临时文件夹内,直接对整个临时文件夹做压缩,压缩完成后删除临时中转目录,全程保留要求的时间戳命名规则。
可直接使用的实现代码:
# 自定义函数:将指定目录的全量内容打包为zip文件 function ZipFiles( $zipfilename, $sourcedir ) { Add-Type -Assembly System.IO.Compression.FileSystem $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,$zipfilename, $compressionLevel, $false) } # 基础路径配置 $sursa_folder="C:\folder\folder\folder\folder" # 源文件存放路径 $sursa_file=@("file1","file2","file3","file4","file5","file6","file7") # 需要打包的所有文件名,按需修改即可 $dest_folder= "F:\+\name\Dump" # 压缩包存储的目标路径 $folderName = "File_Folder" # 临时中转文件夹名称,按需修改 $destinationfolder = New-Item -Path (Join-Path $dest_folder $folderName) -ItemType Directory # 循环复制所有待打包文件到临时中转文件夹 foreach($file in $sursa_file) { Copy-Item (Join-Path $sursa_folder $file) -Destination (Join-Path $dest_folder $folderName) } try { # 打包临时文件夹,压缩包按ddMMyyyy-hh.mm.ss格式附加时间戳命名 ZipFiles -sourcedir (Join-Path $dest_folder $folderName) -zipfilename ((Join-Path $dest_folder $folderName) + (Get-Date).ToString('ddMMyyyy-hh.mm.ss') + ".zip") # 压缩完成后强制删除临时中转文件夹,不做二次确认 Remove-Item -Path (Join-Path $dest_folder $folderName) -Force -ErrorAction Stop -Recurse -Confirm:$false Write-Host "finalizat OK" } catch { write-host "Eroare: $_" } finally {}
实现要点
- 用数组形式存储多个待打包文件名,从根源上避免字符串拼接导致的路径匹配错误
- 临时中转文件夹统一归集所有待打包文件,不需要逐个调整压缩命令的路径参数
- 完全保留原需求的
ddMMyyyy-hh.mm.ss时间戳命名规则,和单文件版本的输出习惯保持一致 - 压缩完成后自动清理临时目录,避免冗余内容占用磁盘空间
内容的提问来源于stack exchange,提问作者Bogdan Nicolescu
相关产品推荐
相关产品推荐

