PowerShell如何按特定名称与月份自动归档过期日志文件
日志归档脚本修正方案
问题分析
现有脚本存在以下核心问题:
- 错误按
DirectoryName分组,所有文件在同一目录下导致分组无效,无法按日志的年月维度归档 - 正则匹配对象错误(匹配目录名而非文件名),且硬编码文件名、年月值,未从日志文件名中提取实际信息
Join-Path参数顺序颠倒,导致压缩包路径生成错误- 重复执行压缩逻辑,移动zip文件时未精准定位当前生成的归档文件
修正后的脚本
$SourceFolder = 'D:\Temp\' $ArchiveFolder = Join-Path -Path $SourceFolder -ChildPath 'Archive' $refDate = (Get-Date).AddMonths(-1).Date # 取1个月前的午夜时间点 # 确保归档目录存在 if (-not (Test-Path -LiteralPath $ArchiveFolder)) { New-Item -Path $ArchiveFolder -ItemType Directory | Out-Null } Get-ChildItem -LiteralPath $SourceFolder -File -Depth 0 -Exclude "*.zip" | Where-Object { # 先匹配文件名格式,再判断文件对应的年月是否早于参考日期 $_.Name -match '^(?<filename>.*)_(?<year>\d{4})_(?<month>\d{2})\..*$' -and (Get-Date -Year $matches.year -Month $matches.month -Day 1) -le $refDate } | # 按文件名中的基础名、年份、月份分组(确保同组文件属于同一归档包) Group-Object -Property @{ Name = "$($matches.filename)_$($matches.year)_$($matches.month)" } | ForEach-Object { # 生成压缩包路径:归档目录下的同名zip $zipPath = Join-Path -Path $ArchiveFolder -ChildPath "$($_.Name).zip" # 压缩当前组的所有文件 Compress-Archive -Path $_.Group.FullName -DestinationPath $zipPath -Update # 删除原文件 $_.Group | Remove-Item -Force }
关键改动说明
- 分组逻辑调整:通过自定义分组属性,从文件名中提取
filename_year_month作为分组键,实现按年月维度归档 - 正则匹配优化:在
Where-Object中完成文件名格式校验+日期判断,过滤出符合条件的文件 - 路径生成修正:正确使用
Join-Path生成归档目录和压缩包路径,避免硬编码路径 - 精准归档移动:直接将压缩包生成在
Archive目录,无需后续移动操作,同时仅删除当前组的原文件 - 容错处理:提前检查并创建归档目录,避免因目录不存在导致的错误
内容的提问来源于stack exchange,提问作者mihai.arsin
相关产品推荐
相关产品推荐

