6

В каталоге у меня есть несколько файлов .jpg .

  • Имена файлов являются целыми числами, начиная с 1.jpg до 150.jpg .

  • Я хотел бы вычесть 1 из каждого имени файла.

  • Таким образом, имена файлов будут от 0.jpg до 149.jpg .

Я знаю, как заменить некоторые символы в имени файла с помощью PowerShell .

Как я могу добиться этого с Powershell?

Ниже приведены сценарии Powershell которые я пробовал.

Скрипт Powershell

gci *.jpg | rename-item -newname {[integer]($_.name -replace ".JPG", "")-1}

А также:

gci *.JPG | rename-item -newname { (([convert]::ToInt32($_.name, 10)) - 1) + ".JPG"}

1 ответ1

10

Имена файлов должны быть от 0.jpg до 149.jpg

Используйте следующую команду PowerShell:

dir *.jpg | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) } | foreach-object -begin { $count=0 } -process { rename-item $_ -NewName "$count.jpg"; $count++ }

Заметки:

  • $count=0 начать отсчет с 0 .
  • $_ представляет каждый элемент, переданный команде rename-item через канал | из команды dir .
  • foreach-object позволяет установить переменную ($count) перед циклическим просмотром каждого файла в каталоге (соответствие *.jpg), а затем выполнить действие (rename-item) для каждого соответствующего элемента.
  • Чтобы отсортировать вывод dir в "естественном" порядке, мы используем:

    Sort-Object { [regex]::Replace($_.Name, '\d+', { args[0].Value.PadLeft(20) }) }
    

Пример:

PS F:\test> dir *.jpg

    Directory: F:\test

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        01/04/2016     19:39         54 1.jpg
-a---        01/04/2016     19:39         54 10.jpg
-a---        01/04/2016     19:39         52 11.jpg
-a---        01/04/2016     19:39         54 2.jpg
-a---        01/04/2016     19:39         54 3.jpg
-a---        01/04/2016     19:35         52 4.jpg
-a---        01/04/2016     19:35         52 5.jpg
-a---        01/04/2016     19:39         51 6.jpg
-a---        01/04/2016     19:39         51 7.jpg
-a---        01/04/2016     19:39         54 8.jpg
-a---        01/04/2016     19:39         52 9.jpg


PS F:\test> dir *.jpg | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) } | foreach-object -begin { $count=0 } -process { rename-item $_ -NewName "$count.jpg"; $count++}

PS F:\test> dir *.jpg

    Directory: F:\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        01/04/2016     19:39         54 0.jpg
-a---        01/04/2016     19:39         54 1.jpg
-a---        01/04/2016     19:39         52 10.jpg
-a---        01/04/2016     19:39         54 2.jpg
-a---        01/04/2016     19:35         52 3.jpg
-a---        01/04/2016     19:35         52 4.jpg
-a---        01/04/2016     19:39         51 5.jpg
-a---        01/04/2016     19:39         51 6.jpg
-a---        01/04/2016     19:39         54 7.jpg
-a---        01/04/2016     19:39         52 8.jpg
-a---        01/04/2016     19:39         54 9.jpg

PS F:\test>

Источник: пакетное переименование файлов с помощью Windows PowerShell. Скрипт был изменен в соответствии с требованиями вопроса.

Источник: Как отсортировать по имени файла так же, как это делает проводник Windows? Ответ Романа Кузьмина на естественную сортировку.

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