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
相关产品推荐
相关产品推荐

