在PowerShell中查找早于当前日期的日志文件

kulphzqa  于 2023-02-19  发布在  Shell
关注(0)|答案(3)|浏览(137)

非常新的PowerShell,我们有一些旧的日志文件,并希望定期删除。因此,为了实现这一点,首先尝试文件名的日志文件,并获得日期值的名称,然后尝试将它们与当前日期进行比较,但不知何故,它是不工作的?任何帮助将是杏子,
该文件夹具有

01-02-2023-20-31-32.log
02-02-2023-20-30-44.log
29-01-2023-20-30-45.log
30-01-2023-20-30-46.log
31-01-2023-20-29-58.log

代码块:

function deleteOlderLogFile () {

        #get all the file inside the foler
        $logFilePath = "C:\Users\LogFolder\";
        $currentDate = Get-Date -Format "dd-MM-yyyy";
        $olderFileName = @();
        $getFileLogFileName =  Get-ChildItem -Path $logFilePath;
        foreach($fileName in $getFileLogFileName) {
            $finalFileName = "$fileName".Substring(0,10);
            $olderFileName += $finalFileName ;
        }
        $finalListOfFolder = $olderFileName -join ","
        Write-Host ":"$finalListOfFolder;

        ##Delete the files
        foreach($logFileName in $finalListOfFolder){ 
                if ($logFileName -ge $currentDate) {
                    Write-Host $logFileName
                }
        }
}
bvjveswy

bvjveswy1#

不应该将日期作为字符串进行比较,而应该作为DateTime对象进行比较(特别是因为这里使用的日期格式是不可排序的)。
假设每个日志文件的文件名都有要比较的日期,并且您要删除名称中日期早于今天日期的所有文件,您可以执行以下操作:

$today = (Get-Date).Date   # set to midnight
$logFilePath = 'C:\Users\LogFolder'
Get-ChildItem -Path $logFilePath -Filter '*.log' -File |
Where-Object { $_.BaseName -match '^\d{2}-\d{2}-\d{4}-\d{2}-\d{2}-\d{2}$' } | ForEach-Object {
    $fileDate = [datetime]::ParseExact($_.BaseName, 'dd-MM-yyyy-HH-mm-ss', $null)
    if ($fileDate -lt $today) {
        $_ | Remove-Item -WhatIf
    }
}

请注意,我已经向Remove-Item cmdlet添加了一个-WhatIf开关。这是一项安全措施,使用该开关时,您将只会在控制台中看到一行,告诉您 * 将 * 执行什么操作。实际上不会删除任何内容。
如果您对所有控制台消息都感到满意,即一切都符合预期,则可以删除这些-WhatIf交换机。

vwhgwdsa

vwhgwdsa2#

我快速浏览了一下你的代码,发现了一些问题。下面是我的deleteOlderLogFile版本。

$logFilePath = "C:\Users\LogFolder\";
    $currentDate = Get-Date -Format "dd-MM-yyyy";
    $olderFileName = @();
    $getFileLogFileName =  Get-ChildItem -Path $logFilePath;
    foreach($fileName in $getFileLogFileName) {
        $finalFileName = "$fileName".Substring(0,10);
        $olderFileName += $finalFileName ;
    }
    $finalListOfFolder = $olderFileName -join ","
    Write-Host ":"$finalListOfFolder;
    Write-Host "today is" $currentDate

    ##Delete the files
    foreach($logFileName in $olderFileName){ 
        $candidateDate = [Datetime]::ParseExact($logFileName, 'dd-MM-yyyy', $null)
        if ($candidateDate -lt $currentDate) {
                Write-Host "delete" $logFileName
            }else{
                Write-Host "do not delete" $logFileName
            }
    }

变更:

  • 你的foreach迭代了一个字符串$finalListOfFolder。这是不可能的。迭代你的数组$olderFileName
  • 您没有将您的文件名转换为DateTime。也许这是不必要的,但从您的问题来看,我认为这正是您想要的。否则,您将比较DateTimeString,这可能不会得到您期望的结果。
  • 您使用了-ge操作符,它将删除所有大于或等于当前日期的文件。我认为您想要删除旧文件,因此您应该使用-lt(小于)。
  • 我添加了输出以确保不删除哪些文件

还有改进的空间,文件还没有实际删除,但现在它应该工作得足够好。

mxg2im7a

mxg2im7a3#

试试看

$dates = @("01-02-2023-20-31-32.log","02-02-2023-20-30-44.log","29-01-2023-20-30-45.log","30-01-2023-20-30-46.log","31-01-2023-20-29-58.log")
$table = [System.Collections.ArrayList]::new()
foreach($date in $dates)
{
   $newRow = New-Object -TypeName psobject
   $newRow | Add-Member -NotePropertyName FileName -NotePropertyValue $date
   $dateTime = [DateTime]::parseexact($date.split('\.')[0],"dd-MM-yyyy-HH-mm-ss",$null)
   $newRow | Add-Member -NotePropertyName Date -NotePropertyValue $dateTime
   $table.Add($newRow)  | Out-Null
}
$table = $table | Sort-Object -Property Date -Descending
$table

结果

FileName                Date
--------                ----
02-02-2023-20-30-44.log 2/2/2023 8:30:44 PM
01-02-2023-20-31-32.log 2/1/2023 8:31:32 PM
31-01-2023-20-29-58.log 1/31/2023 8:29:58 PM
30-01-2023-20-30-46.log 1/30/2023 8:30:46 PM
29-01-2023-20-30-45.log 1/29/2023 8:30:45 PM

相关问题