Переименуйте все файлы в каталоге с помощью пакетного скрипта Windows - PullRequest
14 голосов
/ 21 февраля 2012

Как мне написать пакетный или cmd-файл, который переименует все файлы в каталоге? Я использую Windows.

Изменить это:

750_MOT_Forgiving_120x90.jpg
751_MOT_Persecution_1_120x90.jpg
752_MOT_Persecution_2_120x90.jpg
753_MOT_Hatred_120x90.jpg
754_MOT_Suffering_120x90.jpg
755_MOT_Freedom_of_Religion_120x90.jpg
756_MOT_Layla_Testimony_1_120x90.jpg
757_MOT_Layla_Testimony_2_120x90.jpg

К этому:

750_MOT_Forgiving_67x100.jpg
751_MOT_Persecution_1_67x100.jpg
752_MOT_Persecution_2_67x100.jpg
753_MOT_Hatred_67x100.jpg
754_MOT_Suffering_67x100.jpg
755_MOT_Freedom_of_Religion_67x100.jpg
756_MOT_Layla_Testimony_1_67x100.jpg
757_MOT_Layla_Testimony_2_67x100.jpg

Ответы [ 2 ]

24 голосов
/ 21 февраля 2012

Оператор FOR для циклического перебора имен (введите FOR /? для справки) и поиска и замены строк (введите SET /? для справки).

@echo off
setlocal enableDelayedExpansion
for %%F in (*120x90.jpg) do (
  set "name=%%F"
  ren "!name!" "!name:120x90=67x100!"
)

ОБНОВЛЕНИЕ - 2012-11-07

Я исследовал, как команда RENAME работает с подстановочными знаками: Как команда Windows RENAME интерпретирует подстановочные знаки?

Оказывается, что эту конкретную проблему можно очень легко решить с помощью команды RENAME без необходимости использования пакетного сценария.

ren *_120x90.jpg *_67x100.*

Количество символов после _ не имеет значения.Переименование все равно будет работать правильно, если 120x90 станет x или xxxxxxxxxx.Важным аспектом этой проблемы является то, что весь текст между последним _ и . заменяется.

8 голосов
/ 11 сентября 2013

Начиная с Windows 7 вы можете сделать это в одной строке PowerShell.

powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}"

Объяснение

powershell -C "..." запускает сеанс PowerShell для запуска команды в кавычках. Возвращается к внешней оболочке после завершения команды. -C это сокращение от -Command.

gci возвращает все файлы в текущем каталоге. Это псевдоним для Get-ChildItem.

| % {...} создает конвейер для обработки каждого файла. % является псевдонимом для Foreach-Object.

$_.Name - имя текущего файла в конвейере.

($_.Name -replace '120x90', '67x100') использует оператор -replace для создания нового имени файла. Каждое вхождение первой подстроки заменяется второй подстрокой.

rni меняет имя каждого файла. Первый параметр (называемый -Path) идентифицирует файл. Второй параметр (называемый -NewName) указывает новое имя. rni является псевдонимом для Переименовать-Item .

* * Пример 1 040 * +1041 *
$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_120x90.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_120x90.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_120x90.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free

$ powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}"

$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_67x100.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_67x100.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_67x100.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free
...