2014-08-30 11 views
7

У меня около 1000 изображений, и у них есть имя «IMG-12223». Я хочу переименовать их в 1 2 3 4 ... 1000. Как я могу это сделать. Я написал пакетный скрипт, который перечисляет файлы, но я не знаю, как переименовать каждый файл. например переименовать первое изображение с именем «IMG-12223» на 1, второе изображение с именем «IMG-23441» на 2 и так далее ...Переименование нескольких файлов в каталоге с использованием пакетного скрипта

for /r %%i in (*) do (
    echo %c% 
) 
+0

Просто подсказка: Freeware мультимедийный просмотрщик [IrfanView] (http://www.irfanview.com/) имеет встроенное [пакетное переименование] (http://graphicssoft.about.com/cs/renamers/ht /irfanviewrename.htm) для переименования изображений с помощью счетчика. Также shareware file manager [Total Commander] (http://www.ghisler.com/) имеет функцию [multi-rename] (http://www.ghisler.com/advanced.htm#tutorial_rename) с еще большим количеством опций и очень проста в использовании. На мой взгляд, это не имеет смысла, используя пакетный файл для такой задачи переименования файлов, которая не выполняется автоматически в качестве запланированной задачи. – Mofi

ответ

12

Вот сценарий. Просто поместите скрипт в свою папку и запустите его.

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *') do (
    if not "%%~nxi"=="%~nx0" (
    ren "%%i" "!a!" 
    set /a a+=1 
) 
) 

Если вы хотите сохранить расширения, т.е. переименовать "IMG-12223.jpg", "IMG-12224.jpg" и т.д., чтобы "1.jpg", "2.jpg", и т.д., вы может использовать следующий скрипт.

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *.jpg') do (
    ren "%%i" "!a!.jpg" 
    set /a a+=1 
) 

[Update] Here're объяснения линий, упомянутых в комментарии Джека.

  • setlocal EnableDelayedExpansion

В общем, мы хотим, чтобы переменная a быть отложено расширение, когда он выполняется, но не читается строка. Без него переменная a не может получить увеличенное значение, но всегда 1.

Подробную информацию об EnableDelayedExpansion см. В ответе https://stackoverflow.com/a/18464353/2749114.

  • for /f "delims=" %%i in ('dir /b *.jpg')

Здесь dir с /b опции перечислены только имена файлов всех JPG файлов.

Цикл for перемещает и переименовывает все файлы jpg.

Для параметра delims, поскольку символ разделителя по умолчанию - это пробел, без опции delims=, он не работает с файлами изображений с пробелами в именах файлов. И.Е. для файла изображения с именем «img with spaces.jpg», без опции, значение %%i «img», но не полное имя «img with spaces.jpg», что неверно.

Для петли for, пожалуйста, обратитесь к странице http://ss64.com/nt/for_f.html.

  • if not "%%~ni"=="%~n0"

У меня есть изменить его if not "%%~nxi"=="%~nx0", чтобы быть более точным. И добавленные коды были обновлены.

Это на самом деле используется, чтобы избежать переименования самого файла bat. Если мы ограничиваем переименование только файлами «jpg», тогда строка не нужна.

%%~nxi - это имя файла с расширением для каждого пройденного файла. И %~nx0 - это исполняемый файл bat с расширением. Подробнее см. На странице DOS BAT file equivalent to Unix basename command?.

+0

Спасибо за ваш ответ, не могли бы вы объяснить следующие строки: «setlocal EnableDelayedExpansion», «for/f» delims = «%% i in ('dir/b * .jpg')", если не "%% ~ ni" == "% ~ n0" –

+0

Уверен, я только что улучшил сценарий, а также добавлю пояснения к строкам, которые вы упомянули. На самом деле вы также можете немного изменить сценарий, чтобы взять каталог ваших изображений в качестве параметра. – Landys

0

Попробуйте это, у вас есть пара значений name в текстовом файле, а затем значения цикла и сделайте магию. Значения имен разделяются пустым пространством. Это позволяет сопоставлять старые -> новые имена файлов. Или вы держите счетчик idx + 1 и используете его для новых имен файлов.

keyvalue.bat

@echo off 
set idx=0 
for /F "tokens=1,2" %%A in (keyvalue.txt) do call :PROCESS "%%A" "%%B" 
GOTO :END 

:PROCESS 
set var1=%~1 
set var2=%~2 
set /A idx=%idx%+1 
echo %var1% goes to %var2% (%idx%) 
GOTO :EOF 

:END 
pause 

keyvalue.txt

file888.dat newfile1.dat 
file333.dat newfile2.dat 
file9.dat newfile3.dat 
file01.dat newfile4.dat 
7

Там нет необходимости для пакетного сценария. Простой один лайнер из командной строки может выполнить эту работу :-)

Я использую DIR/B для создания списка файлов, переданных в FINDSTR, для номера файлов, все вложенные с помощью FOR/F для анализа результата и выполните переименование.

for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB" 

Двойной процент, если вы хотите поместить команду в пакетный скрипт.

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