Показать полную графическую версию : [решено] Переименование файлов с указанием порядкового номера
Есть количество файлов которые нужно переименовать.
Прошу помощи - нужен универсальный (по возможности) батник который будет переименовывать файлы.
Важно не то, какое будет текстовое название ( по умолчанию используется исходное название и , как второй вариант - оно должно задаваться пользователем),
а то, чтобы в начале названия присутствовал порядковый номер.
Например:
textA_textB_text001.xxx
textA_textB_text002.xxx
.......................................
на
001_textA_textB.xxx
002_textA_textB.xxx
................................
Более того , если в папке первый файл имеет порядковый номер не 001, а любой последующий - важно,
чтобы при переименовании файла сохранялся свой оригинальный порядковый номер.
Например так:
textA_textB_text051.xxx
textA_textB_text052.xxx
.......................................
на
051textA_textB.xxx
052textA_textB.xxx
..............................
Спасибо!
Foreigner
30-04-2011, 15:40
shao,
Например переименовываем 100 файлов *.txt. Без привязки к исходному названию:
@echo off
setlocal
for %%i in (*.txt) do call:rename "%%i"
goto:eof
:rename
set /a cnt+=1
set "pref=00%cnt%"
ren %1 "%pref:~-3%_newname.txt"
PS. Не 100 а до 999
Foreigner, Отлично! Спасибо - работает.
Пожалуйста, ещё бы вариант привязки к исходному названию. Чтобы не вносить название каждый раз
вручную. Вот так:
textA_textB_text001.xxx
textA_textB_text002.xxx
.......................................
на
001_textA_textB.xxx
002_textA_textB.xxx
................................
И, наберусь наглости ещё попросить обЪяснить как работает Ваш код.. :)
Foreigner
01-05-2011, 12:15
shao,
вариант привязки к исходному названию
Этот вариант только для переименовывания конкретно ваших файлов
обЪяснить как работает
@echo off
setlocal
:: Перебираем все файлы *.ххх в текущей директории и каждый
:: из них передаём в процедуру переименовывания (метка :ren)
for %%i in (*.xxx) do call:ren "%%i"
:: Выход из батника
goto:eof
:: Здесь переименовываем поступивший из цикла for файл
:ren
:: Переменная old получает значение имени файла
set "old=%~n1"
:: Переменная pref получает подстроку -- 3 последних символа в имени файла, т.е. номер
set "pref=%old:~-3%"
:: Переименовываем файл
ren %1 "%pref%_%old:~0,-3%%~x1"
:: Где:
:: %1 -- поступивший файл
:: %old:~0,-3% -- подстрока из имени с 1 до -3 символа ( т.е. отрезали номер )
:: %~x1 -- расширение файла ( .ххх )
Foreigner, спасибо большое за второй скрипт и обЪяснение.
И если не затруднит - обЪясните ещё пожалуйста этот момент:
.......
:rename
set /a cnt+=1
set "pref=00%cnt%"
ren %1 "%pref:~-3%_newname.txt"
из первого скрипта.
Foreigner
02-05-2011, 08:24
shao,
:: Увеличиваем с каждым вызовом порядковое число ( перем. %cnt% ) на 1
set /a cnt+=1
:: Определяем числовой префикс для будущего переименования ( 001, 0010, 00122 и т.д. )
set "pref=00%cnt%"
:: Переименовываем
ren %1 "%pref:~-3%_newname.txt"
:: Где %1 -- исходное имя файла, переданное из цикла for
:: %pref:~-3% -- префикс, приведенный к одной длине, взяты три последние символа ( 001, 010, 122 ).
Foreigner, Спасибо Вам за помощь!
Всё понятно , кроме одного. Что такое "cnt" ?
Foreigner
02-05-2011, 11:26
Что такое "cnt" ? »
=) Просто название переменной. ( от англ. 'count' )
Что такое "cnt" ? »
При использовании в операторе «set» формы «/a» (целочисленные вычисления) нет необходимости использовать «%»/«!» для раскрытия переменных окружения, сие делается автоматически, причём всегда как отложенное раскрытие.
При использовании в операторе «set» формы «/a» (целочисленные вычисления) нет необходимости использовать «%»/«!» для раскрытия переменных окружения, сие делается автоматически, причём всегда как отложенное раскрытие. »не нужно путать подстановки CMD (в т.ч. отложенные) и "подстановки" SET (у которого свой парсер)
@Echo Off
SetLocal EnableDelayedExpansion
set/a "$x=$x+1,$x=$x+1,$x=$x+1"
set/a "$y=!$y!+1,$y=!$y!+1,$y=!$y!+1"
set $
pause>nul
amel27, спасибо. Я не путаю. Про парсер знаю. Должно быть, Вас смутило упоминание «как отложенное раскрытие».
Iska, а замечание и не для Вас, а для тех кто будет читать пост после справки ;)
Столкнулся с новой задачей.
Теперь нужно переименовать файлы , отсекая стандартный текст с номерами в начале названия (сохранив оригинальное последующее название в каждом) и , всё также вначале присваивая порядковые номера файлов.
Пример:
aaaaa 01f01 - bbbb bbbb.txt
aaaaa 01f04 - b bbbb.txt
aaaaa 01f10 - bbb bbb.txt
на
01_bbbb bbbb.txt
02_b bbbb.txt
03_bbb bbb.txt
Я , вот попробовал со своими скудными знаниями что-то сделать... но это жалкие потуги какие-то:
@echo off
setlocal
for %%i in (*.txt) do call:ren "%%i"
:ren
set /a cnt+=1
set "pref=00%cnt%"
set "name=%~n1"
ren %1 "%pref:~-2%_%name:как здесь-не знаю%%~x1"
Прошу помощи, пожалуйста - правильно ли составил и ,
как отсечь стандартный текст с номерами в начале названия в переменной %name% ?
как отсечь стандартный текст с номерами в начале названия в переменной %name% ? »т.е. нужно пропустить в имени первые 14 символов?ren "%1" "%pref:~-2%_%name:~14%%~x1"
т.е. нужно пропустить в имени первые 14 символов? »
Да , именно. Спасибо за помощь и оперативность!!!!
.......
Почему - то "ошибка в синтаксисе команды...."
@echo off
setlocal
for %%i in (*.txt) do call:ren "%%i"
:ren
set /a cnt+=1
set "pref=00%cnt%"
set "name=%~n1"
ren "%1" "%pref:~-2%_%name:~14%%~x1"
shao, после строки с FOR (перед REN) нужно поставить выход из скрипта - EXIT, чтобы предотвратить холостой вход в процедуру REN
а по поводу ошибок - включайте "@echo on" и смотрите, на какой строке валится
amel27, , а по поводу ошибок »
Вот так:
@echo off
setlocal
for %%i in (*.txt) do call:ren "%%i"
:ren
set /a cnt+=1
set "pref=00%cnt%"
set "name=%~n1"
ren %1 "%pref:~-2%_%name:~14%%~x1"
батник работает без "EXIT" после "FOR"
и без кавычек :
ren %1
В таком варианте :
ren "%1" ........
была ошибка синтаксиса....
Почему ?
for %%i in (*.txt) do call:ren "%%i"
exit
:ren
…
ren "%~1" …
exit /b
Iska, спасибо!
Работает так :
ren %1 …
и так:
ren "%~1" …
А в чём разница, если смотреть с точки зрения синтаксиса?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.