Я вижу несколько недостатков с вашим кодом.
Поскольку $array
предположительно заполняется Get-ChildItem
(который на отформатированных дисках ntfs возвращает вывод sorted ), вложенные циклы вообще не нужны.
При итерации с одним просто сравните с предшественником / последователем index +/- 1
.
Поскольку имена включают в ваше описание идентификатор, они всегда разные. Таким образом, вы должны разделить имя на туманном разделителе и проверить, совпадает ли имя машины.
ваша команда if
ничего не генерирует, она просто перезаписывает одну и ту же переменную на каждой итерации.
С хорошей идеей @ Lee_Dailey по группировке вы можете разделять имена на лету и проверять счетчик по группе, сортировать файлы по группе по LastWriteTime и сохранять только самые новые 2.
Итак, дано гипотетическое дерево файлов
> tree /F
A:.
└───Backup
Alpha_8.bak
Bravo_2.bak
Bravo_5.bak
Bravo_6.bak
Bravo_7.bak
Bravo_9.bak
Charlie_1.bak
Charlie_10.bak
Charlie_3.bak
Charlie_4.bak
этот маленький скрипт:
$BackupDir = 'A:\Backup'
$Delim = '_'
Get-ChildItem -Path $BackupDir -File |
Group-Object {($_.BaseName -split $Delim)[0]}
выходы:
Count Name Group
----- ---- -----
1 Alpha {Alpha_8.bak}
5 Bravo {Bravo_2.bak, Bravo_5.bak, Bravo_6.bak, Bravo_7.bak...}
4 Charlie {Charlie_1.bak, Charlie_10.bak, Charlie_3.bak, Charlie_4.bak}
Затем вы можете перебирать группы и удалять файлы для каждой группы любым способом,
Например, удалите все файлы, кроме 2-х новейших (определенных для LastWriteTime), для каждого компьютера:
Get-ChildItem -Path $BackupDir -File |
Group-Object {($_.BaseName -split $Delim)[0]} | ForEach-Object {
$_.Group | Sort LastWriteTime -Desc | Select -skip 2 | Remove-Item -WhatIf
}
Если вывод выглядит нормально, уберите завершающий -WhatIf