You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:49:59