Provavelmente, existe uma maneira melhor de fazer isso, mas aqui está o que eu primeiro pensei em realizar isso; essa abordagem usa grupos de captura nomeados no regex para facilitar a classificação e o agrupamento pelo powershell pelo nome de arquivo base e pela revisão. A variável final $ filesToKeep será uma matriz de objetos FileInfo que você pode excluir do comando delete. É claro que eu recomendo muitos testes antes de deletar qualquer coisa.
$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}