我的公司有一个旧的批处理脚本,每15分钟运行一次,并从两个服务器收集事件日志,并将其放在devs可以访问它的位置以进行分类。
它为每个服务器创建并维护了一整天的事件日志文件(.evtx),然后在第二天开始新的等等。
我最近将它从批处理重写到powershell并添加了一些文件夹清理,文件压缩等,但这只是部分工作。
问题:
脚本应该根据创建日期检查最后7个文件并忽略它们。它应该删除第8,第9,第10等点中的任何内容。相反,它只在一个文件夹(对于一个服务器)中留下5个文件,在另一个文件夹中留下4个文件(对于另一个服务器)。我不知道为什么。我曾经注意过一次或两次的另一个问题是,它会删除列表中第4个位置的文件但忽略第5个然后删除第6个等等。
我不确定拉链部分设置为60天,因为我的脚本只运行了大约20-25天。
代码:
# Cleaning up LogFile folder
Write-Output "Cleaning up existing *.evtx, *.zip and *.7z files to ensure efficient disk space usage..." | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
# Now cleaning up event logs at an interval of 7 days
$EventLogsCount = Get-ChildItem $Path -Recurse -Exclude *.zip, *.7z, *.ps1, *.txt | Where {-not $_.PsIsContainer} | Sort CreationTime -desc | Select -Skip 7 | %{$_.Count}
if ($EventLogsCount -eq $null)
{
Write-Output "No event logs to remove..." | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
}
else
{
Write-Output "Removing the following event log files:" | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
Get-ChildItem $Path -Recurse -Exclude *.zip, *.7z, *.ps1, *.txt | Where {-not $_.PsIsContainer} | Sort CreationTime -desc | Select -Skip 7 | foreach {
$_ | Remove-Item -Recurse
if (Test-Path $_)
{
"Failed to remove $_"
}
else
{
"$_"
}
} | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
}
# Cleaning up zips at a greater interval of 60 days
$ZipsCount = Get-ChildItem $Path -Recurse -Exclude *.evtx, *.ps1, *.txt | Where {-not $_.PsIsContainer} | Sort CreationTime -desc | Select -Skip 60 | %{$_.Count}
if ($ZipsCount -eq $null)
{
Write-Output "No zipped files to remove..." | Out-File $HistFile -append
}
else
{
Write-Output "Removing the following zipped files:" | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
Get-ChildItem $Path -Recurse -Exclude *.evtx, *.ps1, *.txt | Where {-not $_.PsIsContainer} | Sort CreationTime -desc | Select -Skip 60 | foreach {
$_ | Remove-Item -Recurse
if (Test-Path $_)
{
"Failed to remove $_"
}
else
{
"$_"
}
} | Out-File $HistFile -append
Write-Output " " | Out-File $HistFile -append
}
答案 0 :(得分:1)
你的逻辑有点不稳定。目前,您正在收集文件列表,并根据排序的创建时间整体跳过x个文件。您可以使用Get-ChildItem
的{{1}}标志,而不是排除其他所有内容。我已经重写了脚本,以便更容易阅读和运行。它会查看文件的最后写入时间并根据您的阈值进行过滤(事件日志为7天,zip文件为60天)
为预期功能重写了脚本:
-Include