文件删除应该是7天的文件,但只留下5 ...为什么?

时间:2017-07-27 13:56:15

标签: powershell

我的公司有一个旧的批处理脚本,每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
}

1 个答案:

答案 0 :(得分:1)

你的逻辑有点不稳定。目前,您正在收集文件列表,并根据排序的创建时间整体跳过x个文件。您可以使用Get-ChildItem的{​​{1}}标志,而不是排除其他所有内容。我已经重写了脚本,以便更容易阅读和运行。它会查看文件的最后写入时间并根据您的阈值进行过滤(事件日志为7天,zip文件为60天)

为预期功能重写了脚本:

-Include