Powershell excluindo arquivos com expressões regulares

3

Eu tenho vários milhares de arquivos de diferentes revisões em uma pasta.

ACZ002-0.p
ACZ002-1.p
ACZ002-2.p
ACZ051-0.p
ACZ051-1.p
...

A revisão é sempre o último dígito antes do ponto. Eu preciso preservar apenas os arquivos com a revisão mais recente, mas não sei como proceder com o meu código.

$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)}
    
por Ales Novy 07.11.2012 / 08:52

1 resposta

1

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}
    
por 08.11.2012 / 19:26