Переименование файлов PDF в последовательном порядке с использованием powershell - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть большое количество PDF, которые нужно переименовать в последовательном порядке. Первоначально они были отсканированы в один документ, а затем извлечены в виде отдельных файлов. После извлечения название становится «444026-444050 1», «444026-444050 2» и т. Д. c. Я пытаюсь переименовать все файлы в соответствии с номером документа («444026-444050 1» станет «444026»).

Я обнаружил следующую строку кода, которую я могу использовать в Powershell, но, похоже, что с чем-то из 9 файлов есть проблема! Как только я попробую это с 10 файлами, только первый файл будет сохранен правильно. Остальные перемешиваются (файл 444027 содержит содержимое файла 444035, затем файл 444028 содержит 444027, а файл 444029 имеет 444028 и т. Д. c.)

Я думаю, что есть какая-то проблема с al oop , но мне трудно это исправить.

Может кто-нибудь помочь? спасибо

Dir *.pdf | ForEach-Object  -begin { $count=26 }  -process { rename-item $_ -NewName "4440$count.pdf"; $count++ }

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Хорошо. Посмотрим, сделает ли это всех счастливыми. Возможно, вам следует попробовать это с резервной копией файлов.

# make some test files in a new folder
# 1..20 | foreach {
#   if (! (test-path "44026-44050 $_.pdf")) { 
#     echo "44026-44050 $_" > "44026-44050 $_.pdf" }
# }

# rename and pad the first 9 old filenames with a 0 before the last digit for sorting
# is it less than 100 files?
1..9 | foreach {
  ren "44026-44050 $_.pdf" "44026-44050 0$_.pdf" -whatif
}

# make dir complete first with parentheses for powershell 5
# pad $count to 2 digits
# take off the -whatif if it looks ok
(dir *.pdf) | foreach { $count = 1 } {
    $padded = $count | foreach tostring 00
    rename-item $_ -newname 4440$padded.pdf -whatif; $count++ }
1 голос
/ 11 февраля 2020

Порядок, в котором Dir (который является псевдонимом для Get-ChildItem) извлекает элементы, строго не гарантируется. Кроме того, если это сортировка, то, вероятно, сортирует их как строки, а «444026-444050 10» предшествует «444026-444050 2» как строки. Возможно, стоит вставить SortObject в ваш конвейер и использовать Split для получения нужного вам порядкового номера:

Dir *.pdf | Sort-Object -Property {[int]$_.Name.Split()[1].Split(".")[0]} | ForEach-Object  -begin { $count=26 } -process { rename-item $_ -NewName "4440$count.pdf"; $count++ }

Ключевая часть - это новый этап конвейера, вставленный после Dir и до ForEach-Object:

Sort-Object -Property {[int]$_.Name.Split()[1].Split(".")[0]}

Это говорит о необходимости сортировать вывод Dir в соответствии с тем, что находится между первым пробелом и последующим периодом, сравнивая эти вещи как целые числа (не строки). Это гарантирует, что ваши результаты будут упорядочены и вы получите их в порядке чисел c, а не в лексикографии c.

...