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

Exchange服务器清理PowerShell脚本无法选中过期日志文件求助

Exchange服务器清理PowerShell脚本修复方案

故障根因

  • 扫描参数配置错误:Get-ChildItem添加了-Hidden限定,仅会扫描带有隐藏属性的文件,常规日志、备份文件均不会被命中,是无文件被选中的核心原因。
  • 后缀匹配逻辑错误:非LOG类文件的筛选使用-like运算符直接匹配数组,且.tmp、.xml后缀漏写前缀.,无法命中目标文件,需改用-in运算符做准确匹配。
  • 变量类型不规范:$Daysback、$DaysbackLog定义为字符串类型,存在隐式转换出错的风险,建议改为整数类型。
  • 路径重复扫描:两次调用Get-ChildItem扫描相同路径,增加不必要的磁盘IO开销,可合并为一次扫描提升执行效率。

修复后的完整代码

# 定义待扫描的目标路径
$Path = "$env:SystemDrive\Program Files (x86)\GFI\MailEssentials\EmailSecurity\DebugLogs\", 
        "$env:SystemDrive\Program Files (x86)\GFI\MailEssentials\AntiSpam\DebugLogs\", 
        "$env:SystemDrive\inetpub\logs", 
        "$env:windir\System32\LogFiles"

# 定义文件保留时长(单位:天)
$Daysback = 3
$DaysbackLog = 30

$DatetoDelete = (Get-Date).AddDays(-$Daysback)
$DatetoDeleteLog = (Get-Date).AddDays(-$DaysbackLog)

# 合并扫描目标路径,一次性筛选所有符合条件的文件
Get-ChildItem $Path -Recurse -File | Where-Object {
    # 统一转小写避免大小写后缀匹配失败
    $ext = $_.Extension.ToLower()
    ($ext -eq ".log" -and $_.LastWriteTime -lt $DatetoDeleteLog) -or
    ($ext -in ".bak",".tmp",".xml" -and $_.LastWriteTime -lt $DatetoDelete)
} | Remove-Item -Force -ErrorAction SilentlyContinue -WhatIf

# 清理TEMP文件夹及空目录
Get-ChildItem "$env:windir\Temp", "$env:TEMP" -Recurse | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue -WhatIf
Get-ChildItem "$env:windir\Temp", "$env:TEMP" -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem -LiteralPath $_.FullName -Force).Count -eq 0 } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue -WhatIf

注意事项

  • 代码默认保留-WhatIf参数,仅会输出待删除的文件列表,不会实际执行删除操作,确认匹配结果符合预期后,删除所有-WhatIf参数即可正式执行清理。
  • 新增-File参数限定仅扫描文件,避免误匹配目录对象,提升筛选准确性。
  • 新增后缀小写转换逻辑,可同时命中大写后缀(如.BAK、.LOG)的文件。

内容的提问来源于stack exchange,提问作者plantj0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:06:03