Powershell 删除超过 x 天的文件但始终保留最新的文件

Powershell 删除超过 x 天的文件但始终保留最新的文件

我是刚开始学习 powershell 的,正在尝试找到一种方法来实现这一点。如能得到任何帮助,我将不胜感激。

我有一堆路由器和交换机,它们通过 scp 备份配置。它们的命名语法是“hostname-[EPOCH TIMESTAMP].txt”,看起来像 TestRouter-[1650480027].txt

我想删除所有超过 14 天的文件,但始终保留每个设备具有最新纪元时间戳的文件。

我能够使用正则表达式来对纪元日期进行排序,但我不知道如何处理对主机名进行分组的逻辑。

有人对此有好的方法吗?

谢谢你!

编辑 1 Balthazar 基本上是为我写的...谢谢,我现在正在尝试弄清楚其中的测试部分。为了进行测试,我尝试将 remove-item 更改为 write-output,并将时间更改为 5 分钟或秒。但这没有提供任何结果或错误。

    # location of hostname-epoch.txt files
$Root = "Directory"
# Get All txt Files in $Root and Group on hostname, then loop over each group
Get-ChildItem $Root -Filter '*.txt' | Group-Object { $_.BaseName.Split('~')[0] } | ForEach-Object {
    # Today at 00:00:00 - Remove 00:00:00 if you don't want it
    $Today = Get-Date 00:00:00
    # Get Files and skip newest one by default
    $CheckFiles = $_.Group | Sort-Object BaseName -Descending | Select-Object -Skip 1
    # Loop over CheckFiles
    foreach ($File in $CheckFiles) {
        # Get Epoch from FileName
        $FileEpoch = $File.BaseName.Split('~')[1]
        # Get DateTime Object from Epoch
        $FileTime  = (Get-Date 01.01.1970).AddSeconds($FileEpoch)
        # if Timespan is greater than 14 Days delete the file
        if ((New-TimeSpan $FileTime $Today).Seconds -gt -14) {
            Write-Output $File.FullName
        }
    }
}

答案1

我会做这样的事情,假设:

  • 拆分基本名称,hostname始终位于[0]
  • 拆分基本名称,epoch始终位于[1]

这是代码,所有内容都有注释,所以你应该能够理解它的作用

更改的值$Root,并在运行此操作之前备份您的文件。

# location of hostname-epoch.txt files
$Root = "C:\install\superuser1717233"
# Get All txt Files in $Root and Group on hostname, then loop over each group
Get-ChildItem $Root -Filter '*.txt' | Group-Object { $_.BaseName.Split('-')[0] } | ForEach-Object {
    # Today at 00:00:00 - Remove 00:00:00 if you don't want it
    $Today = Get-Date 00:00:00
    # Get Files and skip newest one by default
    $CheckFiles = $_.Group | Sort-Object BaseName -Descending | Select-Object -Skip 1
    # Loop over CheckFiles
    foreach ($File in $CheckFiles) {
        # Get Epoch from FileName
        $FileEpoch = $File.BaseName.Split('-')[1]
        # Get DateTime Object from Epoch
        $FileTime  = (Get-Date 01.01.1970).AddSeconds($FileEpoch)
        # if Timespan is greater than 14 Days delete the file
        if ((New-TimeSpan $FileTime $Today).Days -gt 14) {
            Remove-Item $File.FullName -Force
        }
    }
}

神奇的事情就发生在Group-Object { $_.BaseName.Split('-')[0] }你把每个主机名的文件分组,然后循环遍历它们的地方

相关内容