Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 需要帮助获取日志清理脚本以确认多个条件吗_Powershell - Fatal编程技术网

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

Powershell 需要帮助获取日志清理脚本以确认多个条件吗,powershell,Powershell,我正在编写一个日志清理脚本来清理IIS日志。但是,我有一个需要脚本满足的标准。我需要该脚本跳过只有1个日志文件的文件夹,而不考虑其年龄,并删除所有超过31天的日志。我不是使用Powershell最有经验的人,但每次我运行脚本时。我可以让它跳过存在1个日志文件的文件夹,但它将忽略我的31天标准。当我让它确认31天标准时,它会忽略存在1个日志文件的跳过文件夹并将其清除 任何帮助都将不胜感激 $folders=Get ChildItem c:\inetpub\logs\TestingEnvironme

我正在编写一个日志清理脚本来清理IIS日志。但是,我有一个需要脚本满足的标准。我需要该脚本跳过只有1个日志文件的文件夹,而不考虑其年龄,并删除所有超过31天的日志。我不是使用Powershell最有经验的人,但每次我运行脚本时。我可以让它跳过存在1个日志文件的文件夹,但它将忽略我的31天标准。当我让它确认31天标准时,它会忽略存在1个日志文件的跳过文件夹并将其清除

任何帮助都将不胜感激

$folders=Get ChildItem c:\inetpub\logs\TestingEnvironment-Recurse-Directory
if($folder-eq$folders.FullName){
写入主机“在$folder中清除”
获取ChildItem-路径$folder-筛选器'*.log'|
选择对象-跳过1|
删除项目
Get ChildItem–路径C:\inetpub\logs\TestingEnvironment-Recurse|
其中对象{($\ LastWriteTime-lt(Get Date).AddDays(-31))}
}
我希望脚本能够提供仅存在1个日志的保留文件夹,而不考虑它们的年龄,并清除包含多个超过31天日志的文件夹。

这应该可以做到

$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
        }
    }

这确实大有帮助。但是,某些文件夹只有多个超过31天的日志,正在被清除。我还需要保留一个。@bmaz1093虽然在您的问题中,您说过要删除所有超过31天的日志,但我已更新了答案,以保留最新的日志,并删除所有其他日志。我的错误是不太清楚。这似乎已经做到了!明天,我将抽出时间进一步测试它,并向您汇报。我真是太感谢你了!好的,脚本按我需要的方式执行。我如何让它创建一个.txt文件,列出所有被删除的内容?我可以让它创建一个“Results.txt”文件,但文档是空的。@bmaz1093请参阅我答案的更新2。现在,它会写出一个包含被删除文件全名的文本文件。作为新用户,您可能不知道这一点,但习惯于单击✓ 在左边。这将帮助其他有类似问题的人更容易地找到它。