我是刚开始学习 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] }
你把每个主机名的文件分组,然后循环遍历它们的地方