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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:27:40