需要帮助获取日志清除脚本以确认多个条件

时间:2019-09-09 14:31:10

标签: powershell

我正在使用日志清理脚本来清理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天的文件夹。

1 个答案:

答案 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
        }
    }