Powershell -Переименование файлов из вывода «Group-Object»

Таким образом, у меня есть 150 папок с 100 файлов, названных как этот .. M10001662_3269506_DVLA_Original_Complete_archived_201208_2226.pdfM10001662_3269506_DVLA_Original_Complete_archived_201209_2203.pdfM10001662_3269506_DVLA_Original_Complete_archived_201210_2231.pdfM10001662_3269506_DVLA_Original_Complete_archived_201211_2202.pdf

РЕДАКТИРОВАТЬ Есть около 10 различных имен файлов, все с добавлением "_archived_YYYYMMDD_HHMM.pdf" в конце. Мне просто нужен один (все они идентичны, так что подойдет любой) каждого файла без "_archived_YYYYMMDD_HHMM.pdf" в конце. NB: Тео запросил желаемый результат - из многих файлов, таких как M10001662_3269506_DVLA_Original_Complete_archived_201208_2226.pdf, в один файл, например M10001662_3269506_DVLA_Original_Complete.new

Хотел переименовать файлы, которые я хочу сохранить в * .new. Затем удалите все файлы * .pdf (так же, как я знаю, как это сделать) и, наконец, переименуйте файлы .new обратно в * .pdf, оставив мне только по одному из каждого файл.

Надеюсь, это прояснило, КОНЕЦ РЕДАКТИРОВАНИЯ

У меня есть следующий код, который дает мне имена файлов, которые я хочу сохранить, но на самом деле я не могу выполнить бит переименования.

      # Remove duplicate files - based on name/string search
# set the rootfolder to search
$dir = 'O:\UKCH-DATA\Contact Centre\04 - Main\14 - DVLA\_case_files_archive\M10001662'
# loop through the directories directly under $dir
Get-ChildItem -Path $dir -Filter "*.pdf" |
Group-Object -property {$_.BaseName.split('archived', 2)[0]} | 
ForEach-Object { $_.Group | Select-Object -First 1} 
#Write-Output $Filename.VersionInfo |
#Rename-Item $Filename.VersionInfo -NewName -replace ("\.pdf", ".new")

Возникли проблемы с первой частью переименования, пожалуйста, помогите

2 ответа

Решение

Для переименования вы можете использовать блок сценария delay-bind :

      # ... represents your command from the question.
... | Rename-Item -NewName { $_.Name -replace '_archived.+', '.new' } -WhatIf

Примечание. Общий параметр в приведенной выше команде позволяет предварительно просмотреть операцию. Удалять -WhatIf как только вы будете уверены, что операция сделает то, что вы хотите.

Примечание. Я предполагаю, что вы хотите удалить _archived* часть от имени файла тоже, что и выше -replaceоперация делает; если вы просто хотите изменить расширение имени файла с на .new, использовать { $_.BaseName + '.new' }.


Поскольку выше изменил расширение файла файлов , которые вы хотите сохранить, вы можете удалить.pdf оставленные файлы:

      Remove-Item -Path $dir\*.pdf -WhatIf

Вы можете сделать это проще:

      Get-ChildItem -Path $dir -Filter "*.pdf" |
  Group-Object -property { $_.BaseName.split('archived', 2)[0] } | foreach {
    # rename the file to keep (the 1st file from the group)
    $_.Group | select -First 1 | Rename-Item -NewName ($_.Name + ".pdf")
    # delete the others:
    $_.Group | select -Skip 1 | Remove-Item
}
Другие вопросы по тегам