У меня в папке несколько тысяч файлов разных ревизий.
ACZ002-0.p
ACZ002-1.p
ACZ002-2.p
ACZ051-0.p
ACZ051-1.p
...
Версия всегда - это последняя цифра перед точкой. Мне нужно сохранить только файлы с последней версией, но я не знаю, как продолжить работу с кодом.
$path = "E:\Export\"
$filter = [regex] "[A-Z]{3}[0-9]{3}\-[0-9]{1,2}\.(p)"
$files = Get-ChildItem -Path $path -Recurse | Where-Object {($_.Name -match $filter)}
Вероятно, есть способ сделать это лучше, но вот что я сначала подумал, чтобы это сделать; этот подход использует именованные группы захвата в регулярном выражении, чтобы упростить для PowerShell сортировку и группировку по базовому имени файла и ревизии. Последняя переменная $ filesToKeep будет массивом объектов FileInfo, которые вы можете исключить из своей команды удаления. Конечно, я рекомендую провести много тестов, прежде чем что-либо удалять.
$filter = [regex] "(?<baseName>[A-Za-z]{3}[0-9]{3})\-(?<revision>[0-9]+)\.p"
$results = ls c:\temp -Recurse | where {$_.Name -match $filter} | foreach-object {
new-object PSObject -Property @{
BaseName = $matches.BaseName
Revision = $matches.Revision
File = $_
}
}
$filesToKeep = $results | sort basename, revision -Descending | group basename | ForEach-Object { $_.group | select -first 1 -ExpandProperty File}