PDA

Показать полную графическую версию : [решено] Переименование файлов с указанием порядкового номера


Страниц : [1] 2

shao
30-04-2011, 13:13
Есть количество файлов которые нужно переименовать.
Прошу помощи - нужен универсальный (по возможности) батник который будет переименовывать файлы.
Важно не то, какое будет текстовое название ( по умолчанию используется исходное название и , как второй вариант - оно должно задаваться пользователем),
а то, чтобы в начале названия присутствовал порядковый номер.

Например:
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

shao
01-05-2011, 11:17
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 -- расширение файла ( .ххх )

shao
02-05-2011, 00:04
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 ).

shao
02-05-2011, 11:18
Foreigner, Спасибо Вам за помощь!

Всё понятно , кроме одного. Что такое "cnt" ?

Foreigner
02-05-2011, 11:26
Что такое "cnt" ? »
=) Просто название переменной. ( от англ. 'count' )

Iska
02-05-2011, 13:49
Что такое "cnt" ? »
При использовании в операторе «set» формы «/a» (целочисленные вычисления) нет необходимости использовать «%»/«!» для раскрытия переменных окружения, сие делается автоматически, причём всегда как отложенное раскрытие.

amel27
03-05-2011, 16:18
При использовании в операторе «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

Iska
03-05-2011, 22:05
amel27, спасибо. Я не путаю. Про парсер знаю. Должно быть, Вас смутило упоминание «как отложенное раскрытие».

amel27
04-05-2011, 02:03
Iska, а замечание и не для Вас, а для тех кто будет читать пост после справки ;)

Iska
04-05-2011, 02:59
amel27, спасибо, ясно.

shao
07-05-2011, 18:32
Столкнулся с новой задачей.
Теперь нужно переименовать файлы , отсекая стандартный текст с номерами в начале названия (сохранив оригинальное последующее название в каждом) и , всё также вначале присваивая порядковые номера файлов.

Пример:

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% ?

amel27
07-05-2011, 18:56
как отсечь стандартный текст с номерами в начале названия в переменной %name% ? »т.е. нужно пропустить в имени первые 14 символов?ren "%1" "%pref:~-2%_%name:~14%%~x1"

shao
07-05-2011, 19:07
т.е. нужно пропустить в имени первые 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"

amel27
07-05-2011, 19:16
shao, после строки с FOR (перед REN) нужно поставить выход из скрипта - EXIT, чтобы предотвратить холостой вход в процедуру REN
а по поводу ошибок - включайте "@echo on" и смотрите, на какой строке валится

shao
07-05-2011, 20:28
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" ........
была ошибка синтаксиса....
Почему ?

Iska
07-05-2011, 21:13
for %%i in (*.txt) do call:ren "%%i"
exit

:ren

ren "%~1" …
exit /b

shao
07-05-2011, 21:49
Iska, спасибо!

Работает так :
ren %1 …

и так:
ren "%~1" …

А в чём разница, если смотреть с точки зрения синтаксиса?




© OSzone.net 2001-2012