我正在使用日志清理脚本来清理IIS日志。但是,我有一个需要脚本满足的条件。我需要该脚本来跳过仅包含1个日志文件的文件夹(无论其年龄如何),并删除所有早于31天的日志。我不是Powershell经验最丰富的人,但是每次我运行脚本时,我都不是。我可以跳过存在1个日志文件的文件夹,但是它将忽略我的31天标准。当我确认31天的条件时,它会忽略存在1个日志文件的跳过文件夹并将其清除。
任何帮助将不胜感激!
$folders = Get-ChildItem c:\inetpub\logs\TestingEnvironment -Recurse -Directory
if ($folder -eq $folders.FullName) {
Write-Host "Clearing in $folder"
Get-ChildItem -Path $folder -Filter '*.log' |
Select-Object -Skip 1 |
Remove-Item
Get-ChildItem –Path C:\inetpub\logs\TestingEnvironment -Recurse |
Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(-31)) }
}
我希望该脚本能够为保留文件夹提供仅1个日志(无论它们的年龄如何),并清除包含多个日志的过期时间超过31天的文件夹。
答案 0 :(得分:0)
这应该做
$refDate = (Get-Date).AddDays(-31)
Get-ChildItem 'c:\inetpub\logs\TestingEnvironment' -Recurse -Filter '*.log' -File |
Group-Object DirectoryName |
Where-Object { $_.Count -gt 1 } |
ForEach-Object {
$_.Group | Where-Object { $_.LastWriteTime -lt $refDate } | Remove-Item -WhatIf
}
检查控制台输出是否符合您的期望。如果可以,请删除-WhatIf
开关以实际删除文件。
更新
如果只想保留一个(最新的)文件,则代码看起来像
$refDate = (Get-Date).AddDays(-31)
Get-ChildItem 'c:\inetpub\logs\TestingEnvironment' -Recurse -Filter '*.log' -File |
Group-Object DirectoryName |
Where-Object { $_.Count -gt 1 } |
ForEach-Object {
$_.Group | Where-Object { $_.LastWriteTime -lt $refDate } |
Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 |
Remove-Item -WhatIf
}
更新2
如果正如您评论的那样,您希望脚本写出一个文本文件,其中包含该脚本删除的所有文件名,请将其更改为:
$dateNow = Get-Date
$refDate = $dateNow.AddDays(-31)
$outputFile = 'D:\Results.txt'
Get-ChildItem 'c:\inetpub\logs\TestingEnvironment' -Recurse -Filter '*.log' -File |
Group-Object DirectoryName |
Where-Object { $_.Count -gt 1 } |
ForEach-Object {
$_.Group | Where-Object { $_.LastWriteTime -lt $refDate } |
Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 |
ForEach-Object {
'{0:yyyy-MM-dd HH:mm:ss} {1}' -f $dateNow, $_.FullName | Add-Content -Path $outputFile
$_ | Remove-Item -WhatIf
}
}