Excluindo todas as últimas revisões de um arquivo

1

Então eu tenho essas listas enormes de desenhos que eu fiz para o trabalho e gostaria de poder despejá-las em uma pasta e executar um lote que excluiria todas as rotações mais antigas e deixaria as rotações mais altas. lá. Eu nem tenho certeza se isso é possível sem alguma programação seriamente profunda, então eu pensei em perguntar aqui.

Nomes de arquivos de exemplo:

  • 01-XY-001-Rev-0_1-6-2014.pdf
  • 01-XY-001-Rev-2_1-13-2014.pdf
  • 01-XY-001-Rev-9_2-1-2014.pdf
  • 01-XY-001-Rev-11_2-4-2014.pdf
  • 01-XY-002-Rev-0_1-7-2014.pdf
  • 01-XY-002-Rev-4_1-13-2014.pdf
  • 01-XY-002-Rev-7_1-26-2014.pdf
  • 01-XY-002-Rev-11_2-4-2014.pdf
  • 01-XXX-001-Rev-0_1-13-2014.pdf
  • 01-XXX-001-Rev-4_1-21-2014.pdf
  • 01-XXX-001-Rev-6_2-1-2014.pdf
  • 01-XXX-001-Rev-10_2-4-2014.pdf

no final, eu quero que pareça:

  • 01-XY-001-Rev-11_2-4-2014.pdf
  • 01-XY-002-Rev-11_2-4-2014.pdf
  • 01-XXX-001-Rev-10_2-4-2014.pdf

e assim por diante. Isso é possível, tendo em mente que existem centenas desses arquivos com nomes diferentes? O único pensamento que é consistente é o Rev-1, Rev-2, Rev-3, etc. O resto muda como visto acima, baseado no desenho. Eu realmente não vejo isso como possível, mas estou disposto a perguntar de qualquer maneira.

    
por Helzehen 08.08.2014 / 17:46

1 resposta

1

Não somos um serviço de criação de scripts, mas eu tinha algum tempo e interesse, então aqui vai você, em um script do PowerShell:

#Set directory to search (. = current directory).
$dir = "."

#Get a list of all the files (only), sorted with newest on top.
$dirFiles = Get-ChildItem -Path $dir | where { ! $_.PSIsContainer } | Sort-Object LastAccessTime -Descending

#Create an array to hold unique file name parts.
$uniqueFileNameParts = @()

#Create an array to hold final file list of files to keep.
$filesToKeep = @()

#Add the file name of the script itself to the files to keep, to prevent it from being deleted if it's in the same folder you're trying to clean.
$filesToKeep += $MyInvocation.MyCommand.Name

#Loop through all the files in the directory list.
foreach ($file in $dirFiles) {
    #If it contains "-Rev-" pull the first part of the file name (up to and including "-Rev-").
    $filenameTokenLocation = $file.name.IndexOf("-Rev-")
    if ($filenameTokenLocation -ge 0) {
        $endOfString = $filenameTokenLocation + 5
        $subString = $file.name.Substring(0,$endOfString)

        #If the file name part doesn't already exist in the array, add it to it.
        if ($uniqueFileNameParts -notcontains $subString) {
            $uniqueFileNameParts += $subString
        } 
    }
}

#Loop through all the file name parts.
foreach ($fileName in $uniqueFileNameParts) {
    #Create a list of all files starting with that file name part, select the one file with the newest "LastWriteTime" attribute, and assign it to $latest.
    $latest = Get-ChildItem -Path $dir | where { ! $_.PSIsContainer } | where {  $_.name.StartsWith($fileName) } | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    #Add that file to the list of files to keep.
    $filesToKeep += $latest.name
}

#Get all files in the folder that are not in the list of files to keep, and remove them.
Get-ChildItem -exclude ($filesToKeep) | where { ! $_.PSIsContainer } | Remove-Item

Notas:

  • Ele usa o Último tempo de gravação do arquivo para determinar qual é o "mais recente", os carimbos de data / hora nos próprios nomes dos arquivos não são considerados.
  • É sensível a maiúsculas e minúsculas, portanto, um arquivo chamado XYZ.txt não é necessariamente o mesmo que um denominado xYz.TxT
  • Não é recursivo, ele apenas verifica a pasta / diretório em que você aponta, ignorando subpastas.
  • É perigoso como todos os itens, então faça um backup da pasta antes de tentar. :)

Espero que ajude!

    
por 08.08.2014 / 22:31