PowerShell按日期压缩文件问题:重复打包目录与文件如何解决
解决PowerShell打包重复文件夹和文件的问题
嘿,这个问题我之前处理过!你的脚本之所以会出现重复打包的情况,核心原因是Get-ChildItem默认会同时返回文件夹和文件,当你把这两类对象一起传给Compress-Archive时,就会导致:符合条件的文件夹被完整打包(包含里面的文件),而文件夹里的文件又被单独打包一次,最终zip里就出现了重复内容。
问题根源拆解
原脚本里的Get-ChildItem -recurse没有指定类型,会遍历目标路径下所有的子项——不管是文件夹还是文件。当你的2018年文件夹和里面的文件都符合创建时间条件时,两者都会被加入$files集合,打包时自然就重复了。
两种解决方案
根据你的需求,我提供两种针对性的修改方案:
方案1:打包包含目标文件的整个文件夹(推荐,适合归档完整目录)
如果你希望直接归档那些包含目标年份文件的文件夹,而不是单独的文件,可以这样修改脚本:
param( [String]$path="DieserPfadWirdAlsParameterGesetzt" ) $exclude=@("*.zip") $currentYear = (Get-Date).AddYears(-1).ToString("yyyy") $firstDayOfYear = Get-Date -Day 1 -Month 1 -Year $currentYear -Hour 0 -Minute 0 -Second 0 $lastDayOfYear = Get-Date -Day 31 -Month 12 -Year $currentYear -Hour 23 -Minute 59 -Second 59 # 第一步:筛选出所有符合时间条件的文件 $targetFiles = Get-ChildItem -Path $path -Recurse -File -Exclude $exclude | Where-Object { $_.CreationTime -ge $firstDayOfYear -and $_.CreationTime -lt $lastDayOfYear } # 第二步:提取这些文件的唯一父目录(去重,避免重复打包同一个文件夹) $targetFolders = $targetFiles | Select-Object -ExpandProperty DirectoryName -Unique # 第三步:打包这些文件夹,-Force参数覆盖已存在的zip Compress-Archive -Path $targetFolders -DestinationPath "$path\Archiv$currentYear.zip" -Force # 最后删除原文件夹(和你原脚本的删除逻辑一致,会删除文件夹及内部所有内容) Remove-Item $targetFolders -Recurse -Force -Exclude $exclude
方案2:只打包目标文件但保留目录结构
如果你只想归档符合条件的文件,同时保留它们原有的目录结构(避免zip里出现单独的文件夹项),可以用这个版本:
param( [String]$path="DieserPfadWirdAlsParameterGesetzt" ) $exclude=@("*.zip") $currentYear = (Get-Date).AddYears(-1).ToString("yyyy") $firstDayOfYear = Get-Date -Day 1 -Month 1 -Year $currentYear -Hour 0 -Minute 0 -Second 0 $lastDayOfYear = Get-Date -Day 31 -Month 12 -Year $currentYear -Hour 23 -Minute 59 -Second 59 # 只筛选符合条件的文件,不包含文件夹 $files = Get-ChildItem -Path $path -Recurse -File -Exclude $exclude | Where-Object { $_.CreationTime -ge $firstDayOfYear -and $_.CreationTime -lt $lastDayOfYear } # 打包时自动保留文件的相对目录结构,不会出现重复内容 Compress-Archive -Path $files.FullName -DestinationPath "$path\Archiv$currentYear.zip" -Force # 只删除选中的文件,不删除文件夹 Remove-Item $files.FullName -Force
关键修改点说明
- 新增
-File参数:让Get-ChildItem只返回文件,避免误选文件夹。 - 目录去重(方案1):通过
Select-Object -Unique确保同一个文件夹只被打包一次。 -Force参数:覆盖已存在的归档文件,避免脚本运行时报错。
内容的提问来源于stack exchange,提问作者user10691993
相关产品推荐
相关产品推荐

