2012-02-21 8 views
13

Как написать пакетный или cmd-файл, который переименует все файлы в каталоге? Я использую Windows.Переименуйте все файлы в каталоге с помощью командного сценария 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 
+1

окна и все, что работает в .bat или CMD-файл? – Blainer

+0

Чувак, если вы хотите помочь, вы не можете ожидать, что все будут психическими. –

ответ

22

A Для заявления к проходным имена (типа FOR /? помощи), а также строки поиска и замены (тип SET /? для справки) ,

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


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

Я исследовал, как ПЕРЕИМЕНОВАТЬ команда имеет дело с групповыми символами: How does the Windows RENAME command interpret wildcards?

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

ren *_120x90.jpg *_67x100.* 

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

+2

Я не уверен, что это полный пример. Но [This] (http://stackoverflow.com/a/3811991) работал для меня как шарм :) –

+2

@Anand - Я добавил гораздо более простое решение, используя только команду REN. Ссылка в вашем комментарии в основном такая же, как и мой первоначальный ответ. – dbenham

+0

Можете ли вы разделить свои два ответа? Я оставил бы «ren» один слой в этом; это лучшее! –

8

С 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 - это псевдоним для Rename-Item.

Пример

$ 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 
+0

@MethodMan, какое значение должно иметь временная метка? –

+0

Я понял это, объединившись с скриптом RobbCopy и создав функцию goto внутри файла bat. Спасибо, что я не знаком с powershell, но если бы мне пришлось иметь значение timestamp, это было бы 'yyyymmddss' с маской что бы было _ _ ​​_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – MethodMan

Смежные вопросы