Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование файлов с указанием порядкового номера

Ответить
Настройки темы
CMD/BAT - [решено] Переименование файлов с указанием порядкового номера

Аватара для shao

Ветеран


Сообщения: 1014
Благодарности: 194

Профиль | Отправить PM | Цитировать


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

Например:
Код: Выделить весь код
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
..............................
Спасибо!

Отправлено: 13:13, 30-04-2011

 

Аватара для shao

Ветеран


Сообщения: 1014
Благодарности: 194

Профиль | Отправить PM | Цитировать


Iska, всё получилось !
На харде , фаловая система FAT32 - такой батник:
Код: Выделить весь код
@echo off
setlocal

for /f "tokens=*" %%i in ('dir /b /o:n "*.avi"') do call:ren "%%i"
goto:eof

:ren
set /a cnt+=1
set "pref=00%cnt%"
set "name=%~n1"

ren "%~1" "%pref:~-2%_%name:~16%%~x1"
На харде , фаловая система NTFS - такой батник:
Код: Выделить весь код
@echo off
setlocal

for %%i in (*.avi) do call:ren "%%i"
goto:eof

:ren
set /a cnt+=1
set "pref=00%cnt%"
set "name=%~n1"

ren "%~1" "%pref:~-2%_%name:~16%%~x1"
Благодарю Вас и El Sanchez, Foreigner, amel27, за помощь !!!

*****************************************************

Если не затруднит - ещё вопросы, пожалуйста:

1. Есть ли принципиальное различие между "exit" и "goto:eof" ?
2. В каких случаях , что лучше указывать ?
3. Достаточно ли только после "FOR" указать окончание ?
4. как грамотнее всего использовать эти команды ?


Спасибо!

Отправлено: 16:32, 09-05-2011 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата shao:
1. Есть ли принципиальное различие между "exit" и "goto:eof" ? »
Принципиальное различие — «exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле.
Цитата shao:
2. В каких случаях , что лучше указывать ? »
Я остановился на «exit /b». Некоторые исследования на эту тему можно увидеть в двух классических трудах:
Урок bat-аники
Особенности реализации командного процессора cmd.exe операционных систем WinNT.
Цитата shao:
3. Достаточно ли только после "FOR" указать окончание ? »
Вопрос не понятен.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:31, 09-05-2011 | #32


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Iska:
«exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле »
GoTo:EOF сохраняет код возврата последней команды, который тоже можно получить и обработать в вызывающем пакетном файле ;)
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:46, 10-05-2011 | #33


Аватара для shao

Ветеран


Сообщения: 1014
Благодарности: 194

Профиль | Отправить PM | Цитировать


Цитата Iska:
«exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле.
»
Цитата amel27:
GoTo:EOF сохраняет код возврата последней команды, который тоже можно получить и обработать в вызывающем пакетном файле »
Так , что получается - без разницы , что указывать ?

Отправлено: 11:54, 11-05-2011 | #34


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата shao:
Так , что получается - без разницы , что указывать ? »
- если Вы не собираетесь обрабатывать ошибки - без разницы;
- если результат процедуры зависит всего от одной команды (типа REN), то достаточно GoTo:EOF, но только сразу после неё, иначе другая команда перезапишет код ошибки;
- если результат процедуры зависит от нескольких команд, других условий либо Вы хотите ввести свою нумерацию исключительных ситуаций, то Exit/B.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:03, 11-05-2011 | #35


Ветеран


Сообщения: 2196
Благодарности: 727

Профиль | Отправить PM | Цитировать


Пришло время навести порядок в картинках. Суть в том, что есть многоуровневая структура вложенных папок. В последней папке лежат файлы *.jpg, *.bmp, *.gif Необходимо переименовать файлы по имени папки, в которой они лежат с порядковым номером и соответствующим разрешением.
К примеру, файлы лежат в папке Priroda. На выходе файлы должны переименоваться
Код: Выделить весь код
Priroda-1.jpg
Priroda-2.jpg
Priroda-3.jpg
....
Priroda-1.bmp
Priroda-2.bmp
Priroda-3.bmp
...
Priroda-1.gif
Priroda-2.gif
Priroda-3.gif

Отправлено: 12:02, 28-09-2011 | #36


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Цитата sov44:
Необходимо переименовать файлы по имени папки, в которой они лежат с порядковым номером и соответствующим разрешением. »
Код: Выделить весь код
@echo off

:: Папка, в которой нужно искать
set "sDir=z:\myfolder"

:: Параметрами проставить нужные расширения
for /r "%sDir%" %%a in (.) do call:RenPicture "%%~dpna" bmp jpg gif

goto:eof
 
:RenPicture
if not "%2"=="" (
for /f "tokens=1* delims=:" %%i in (
   'dir "%~1\*.%2" /a-d/b 2^>nul ^| findstr /i/n "\.%2$" 2^>nul'
) do ren "%~1\%%j" "%~n1-%%i.%2" 2>nul
shift /2
goto RenPicture
)

Последний раз редактировалось SendMessage, 28-09-2011 в 15:51. Причина: оптимизация скрипта

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:16, 28-09-2011 | #37


Ветеран


Сообщения: 2196
Благодарности: 727

Профиль | Отправить PM | Цитировать


SendMessage, Спасибо, то, что надо! Если не сложно, поясните его пожалуйста.

Моей фантазии пока хватило на это:
Код: Выделить весь код
@Echo Off
SetLocal EnableExtensions

call :1 "*.jpg"
call :1 "*.bmp"
call :1 "*.gif"
exit

:1
set hh=c:\WL
set cnt=0
For /F "Delims=" %%I In ('Dir %hh%\%1 /B /S 2^>nul') Do (
set kk=%%I
call :ren %kk%
)
exit /b

:ren
set /a cnt+=1
for /f "tokens=1,2,3,4,5 delims=\" %%a in ("%kk%") do (
set ddd=%%d
set ooo=%%e 
)
ren %ooo% "%ddd%-%Cnt%%~x1"
Скрипт не доработан, т.к. пока не додумал как нумеровать файлы отдельно в каждой папке начиная с первого. Может и мои ошибки покажете.

Последний раз редактировалось sov44, 28-09-2011 в 17:13.


Отправлено: 16:53, 28-09-2011 | #38


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Цитата sov44:
Если не сложно, поясните его пожалуйста. »
Попробую:
Код: Выделить весь код
for /r "%sDir%" %%a in (.) do call:RenPicture "%%~dpna" bmp jpg gif
Ну эту строчка и так понятна - рекурсивный обход папок, если стоит в множестве точка - перечисляются только папки. В инструкцию RenPicture передаются маршрут обрабатываемой в текущий момент папки и все нужные расширения.
if not "%2"=="" - то есть если параметр не пустой выполняются нужные действия.
for /f "tokens=1* delims=:" %%i in ('dir "%~1\*.%2" /a-d/b 2^>nul ^| findstr /i/n "\.%2$" 2^>nul') - выводятся все файлы с нужным расширением, а команда findstr их пронумеровывает (ключ /n) - на выводе они выглядят примерно так:
Код: Выделить весь код
1:fileOne.bmp
2:fileTwo.bmp
3:OtherFile.bmp
Ну и, соответственно, на выходе отпарсенная строка в переменную %%i получает номер, а в переменную %%j - имя файла.
ren "%~1\%%j" "%~n1-%%i.%2" 2>nul - здесь пояснения тоже не очень нужны. %~1 - маршрут папки, %~n1 - имя папки.
shift /2 - сдвиг параметров. То есть - тот, что до этой команды находился в переменной %3, сдвигается в переменную %2, а из %4 в %3. Поскольку у shift стоит ключ /2 - это означает, что сдвиг будет происходить со 2-го параметра, а 1-й останется неизменным. Таким образом для текущей папки перебираются все нужные расширения. После того, как все они обработаются, управление опять переходит к первому for и начинает обрабатываться следующая папка.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:54, 28-09-2011 | #39



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование файлов с указанием порядкового номера

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Смена порядкового номера монитора M1ndW0rk Microsoft Windows 2000/XP 19 04-12-2020 23:39
CMD/BAT - [решено] Список файлов из поддиректорий с указанием полного пути Sat_Kelman Скриптовые языки администрирования Windows 4 20-03-2020 17:17
CMD/BAT - Переименование файлов. gen0m.rsw Скриптовые языки администрирования Windows 1 15-10-2010 19:15
Как сделать наглядный листинг папок и файлов с указанием всех прав доступа chickaboo Microsoft Windows NT/2000/2003 10 15-02-2008 16:54
переименование файлов mask Программирование и базы данных 6 20-05-2003 00:53




 
Переход