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

Компьютерный форум 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

 

Ветеран


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

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


Цитата shao:
А в чём разница, если смотреть с точки зрения синтаксиса? »
Хоть убей, сейчас уже не вспомню, почему я пришёл к именно такому подходу. То ли какие-то приложения требовали обязательно закавычивать аргументы, то ли ещё что-то… Увы, уже не помню.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:21, 07-05-2011 | #21



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

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


Аватара для shao

Ветеран


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

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


Цитата Iska:
....Увы, уже не помню. »
Я всецело доверяюсь Вашему опыту и знаниям...

Отправлено: 23:13, 07-05-2011 | #22


Ветеран


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

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


Тогда уж, пожалуйста, доверьтесь моему опыту и в таком суждении: «Доверяй, но проверяй» .

Отправлено: 23:37, 07-05-2011 | #23


Аватара для El Sanchez

Ветеран


Contributor


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

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



Цитата shao:
А в чём разница, если смотреть с точки зрения синтаксиса? »
shao,
Второй вариант предпочтительней и рекомендуется к применению. Параметр, переданный в процедуру или скрипт и содержащий символ пробела, обязан быть заключен в двойные кавычки, чтобы CMD не интерпретировал этот параметр как отдельные сегменты. Например:
Код: Выделить весь код
batchfile.bat C:\Program Files (x86) - CMD интерпретирует это как передачу в скрипт 3 параметров
%1 будет содержать - C:\Program
%2 будет содержать - Files
%3 будет содержать - (x86)

batchfile.bat "C:\Program Files (x86)" - CMD интерпретирует это как передачу в скрипт 1 параметра
%1 будет содержать - "C:\Program Files (x86)"

... call:ren "%%i" - передача функции :ren 1 параметра %i, содержащего (без)пробельное имя txt-файла
%1 будет содержать - "имя файла.txt"
Все хорошо, переменная определена как единое целое, но теперь %1 содержит в себе нежелательные, искажающие реальное представление значения параметра, двойные кавычки, от которых необходимо избавляться, добавив символ тильды (~) после знака процента (%). Например:
Код: Выделить весь код
batchfile.bat "C:\Program Files (x86)"
%~1 будет содержать - C:\Program Files (x86)

Зачем избавляться:
echo %1\Opera - вернет "C:\Program Files (x86)"\Opera. Неправильный путь, теперь представьте, если вместо echo будет команда, работающая с путями, например, Dir.
echo %~1\Opera - вернет C:\Program Files (x86)\Opera. Теперь путь верен, но для команд, работающих с путями (читай - параметрами, содержащими символы пробела), такой путь будет интерпретирован, как передачу команде нескольких параметров, разделенных символом пробела, поэтому снова заключаем все это добро в кавычки:
dir "%~1\Opera"
ren "%~1"
Выводы: "закавычивайте" параметры, передаваемые в скрипт/функцию, даже если параметр не будет содержать пробел или другие спецсимволы; в теле скрипта/функции удалять кавычки из значения переменной, используя тильду (~), даже если параметр передан без помощи двойных кавычек; снова "закавычивать" переменную или комбинацию с ее участием для команд ее использующую, даже если для команды кавычки не нужны.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:06, 08-05-2011 | #24


Аватара для shao

Ветеран


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

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


El Sanchez, спасибо за объяснения! Порой, таких детальных обЪяснений не хватает здесь !

Но получается какая-то фигня у меня , ребята....

Этот код работает на текстовых файлах. Переименовывает отлично.
Код: Выделить весь код
@echo off
setlocal

for %%i in (*.XXX) 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"
Попробовал переименовать видеофайлы(большого веса) - вот тут и нескладуха получается.
Если указываю в конце кода "EXIT"или "EXIT /B" переименовывает все вот так :

Код: Выделить весь код
01_.avi
02_.avi
03_.avi
................
Ставлю паузу в конце - переименовывает (по одному при моём участии) правильно.
Но не по порядку следования файлов. А в разброс...

Отправлено: 17:53, 08-05-2011 | #25


Ветеран


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

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


shao, приведите исходные имена файлов, из которых получаются:
Код: Выделить весь код
01_.avi
02_.avi
03_.avi
а также укажите файловую систему того раздела, на котором находятся исходные файлы.

Отправлено: 18:27, 08-05-2011 | #26


Аватара для shao

Ветеран


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

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


Цитата Iska:
приведите исходные имена файлов ........укажите файловую систему..... »
Флешка ! Файловая система FAT32
Блин, на компьютере на харде не додумался это сделать...
Интересно, а разве это может как-то влиять на работу батника ?!!!

Имена файлов:
Код: Выделить весь код
Smurfs s01e01 - The Smurf's Apprentice.avi
Smurfs s01e02 - The Smurfette.avi
Smurfs s01e03 - Vanity Fare.avi

и т.д.

Отправлено: 20:55, 08-05-2011 | #27


Ветеран


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

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


Цитата shao:
Флешка ! Файловая система FAT32
Блин, на компьютере на харде не додумался это сделать...
Интересно, а разве это может как-то влиять на работу батника ?!!! »
Влияет. В NTFS, упрощённо говоря, каталог всегда хранится в отсортированном виде. В FAT/FAT32 — в порядке создания файлов в каталоге. Выход — делать в цикле разбор списка файлов, полученных по:
Код: Выделить весь код
dir /b /o:n "*.xxx"
Т.е., наподобие [не проверялось!]:
Код: Выделить весь код
for /f "tokens=*" %%i in ('dir /b /o:n "*.xxx"') do call…
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:37, 08-05-2011 | #28


Аватара для shao

Ветеран


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

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


Спасибо Iska !
Я сейчас не смогу проверить. Завтра....

И ещё : команда " /o:n " , нсколько понимаю сортирует по имени. А что делает команда " /b " ?
Из справки, по ней ничего не понял....

Отправлено: 22:14, 08-05-2011 | #29


Ветеран


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

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


Условно говоря, отсекает вводную, суммарную и детальную информацию:
читать дальше »
Код: Выделить весь код
E:\Песочница\0054>dir
 Том в устройстве E не имеет метки.
 Серийный номер тома: ****-****

 Содержимое папки E:\Песочница\0054

08.05.2011  23:48    <DIR>          .
08.05.2011  23:48    <DIR>          ..
08.05.2011  19:51               326 0001.cmd
08.05.2011  21:39               109 0002.cmd
08.05.2011  21:38               134 0003.cmd
08.05.2011  19:39             5,428 AVZ.vbs
08.05.2011  16:48             5,290 AVZ2.vbs
               5 файлов         11,287 байт
               2 папок   ********** байт свободно

оставляя только имена файлов:
читать дальше »
Код: Выделить весь код
E:\Песочница\0054>dir /b
0001.cmd
0002.cmd
0003.cmd
AVZ.vbs
AVZ2.vbs

Причём, при использовании параметра «/s» («включая подкаталоги») имена файлов будут полными:
читать дальше »
Код: Выделить весь код
E:\Песочница\0054>dir /b /s
E:\Песочница\0054\0001.cmd
E:\Песочница\0054\0002.cmd
E:\Песочница\0054\0003.cmd
E:\Песочница\0054\AVZ.vbs
E:\Песочница\0054\AVZ2.vbs
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:17, 09-05-2011 | #30



Компьютерный форум 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




 
Переход