1

Итак, у меня есть эти массивные списки рисунков, которые я сделал для работы, и я хотел бы иметь возможность свести их все в одну папку и запустить пакет, который удалит все более старые обороты и оставит там самый высокий обороты. Я даже не уверен, что это возможно без какого-либо серьезного программирования, поэтому я решил спросить здесь.

Примеры имен файлов:

  • 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

В конце я хочу, чтобы это выглядело так:

  • 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

так далее и так далее. Возможно ли это, учитывая, что существуют сотни таких файлов с разными именами? Единственная мысль, которая является последовательной, это Rev-1, Rev-2, Rev-3 и т.д. Остальные изменения, как видно выше, основаны на чертеже. Я не считаю это возможным, но я все равно хочу спросить.

1 ответ1

1

Мы не являемся сервисом для написания скриптов, но у меня было немного времени и интереса, так что давайте, по сценарию 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

Заметки:

  • Он использует время последней записи файла, чтобы определить, какой из них является "самым последним", отметки времени / даты в самих именах файлов не учитываются.
  • Он чувствителен к регистру, поэтому файл с именем XYZ.txt не обязательно совпадает с файлом с именем xYz.Текст
  • Он не рекурсивный, он только проверяет папку / каталог, к которому вы стремитесь, игнорируя подпапки.
  • Это опасно, как и все, так что сделайте резервную копию папки, прежде чем пытаться это сделать. :)

Надеюсь, это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .