Показать полную графическую версию : [решено] Переименование файлов с указанием порядкового номера
А в чём разница, если смотреть с точки зрения синтаксиса? »
Хоть убей, сейчас уже не вспомню, почему я пришёл к именно такому подходу. То ли какие-то приложения требовали обязательно закавычивать аргументы, то ли ещё что-то… Увы, уже не помню.
....Увы, уже не помню. »
Я всецело доверяюсь Вашему опыту и знаниям... :)
Тогда уж, пожалуйста, доверьтесь моему опыту и в таком суждении: «Доверяй, но проверяй» ;).
El Sanchez
08-05-2011, 14:06
А в чём разница, если смотреть с точки зрения синтаксиса? »
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" …
Выводы: "закавычивайте" параметры, передаваемые в скрипт/функцию, даже если параметр не будет содержать пробел или другие спецсимволы; в теле скрипта/функции удалять кавычки из значения переменной, используя тильду (~), даже если параметр передан без помощи двойных кавычек; снова "закавычивать" переменную или комбинацию с ее участием для команд ее использующую, даже если для команды кавычки не нужны.
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
................
Ставлю паузу в конце - переименовывает (по одному при моём участии) правильно.
Но не по порядку следования файлов. А в разброс...
shao, приведите исходные имена файлов, из которых получаются:
01_.avi
02_.avi
03_.avi
а также укажите файловую систему того раздела, на котором находятся исходные файлы.
приведите исходные имена файлов ........укажите файловую систему..... »
Флешка ! Файловая система FAT32
Блин, на компьютере на харде не додумался это сделать...
Интересно, а разве это может как-то влиять на работу батника ?!!!
Имена файлов:
Smurfs s01e01 - The Smurf's Apprentice.avi
Smurfs s01e02 - The Smurfette.avi
Smurfs s01e03 - Vanity Fare.avi
и т.д.
Флешка ! Файловая система FAT32
Блин, на компьютере на харде не додумался это сделать...
Интересно, а разве это может как-то влиять на работу батника ?!!! »
Влияет. В NTFS, упрощённо говоря, каталог всегда хранится в отсортированном виде. В FAT/FAT32 — в порядке создания файлов в каталоге. Выход — делать в цикле разбор списка файлов, полученных по:
dir /b /o:n "*.xxx"
Т.е., наподобие [не проверялось!]:
for /f "tokens=*" %%i in ('dir /b /o:n "*.xxx"') do call…
Спасибо Iska !
Я сейчас не смогу проверить. Завтра....
И ещё : команда " /o:n " , нсколько понимаю сортирует по имени. А что делает команда " /b " ?
Из справки, по ней ничего не понял....
Условно говоря, отсекает вводную, суммарную и детальную информацию:
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
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. как грамотнее всего использовать эти команды ?
Спасибо!
1. Есть ли принципиальное различие между "exit" и "goto:eof" ? »
Принципиальное различие — «exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле.2. В каких случаях , что лучше указывать ? »
Я остановился на «exit /b». Некоторые исследования на эту тему можно увидеть в двух классических трудах:
Урок bat-аники (http://www.rsdn.ru/article/winshell/batanyca.xml)
Особенности реализации командного процессора cmd.exe операционных систем WinNT (http://www.rsdn.ru/article/winshell/NTCommandProcessor.xml).
3. Достаточно ли только после "FOR" указать окончание ? »
Вопрос не понятен.
«exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле »GoTo:EOF сохраняет код возврата последней команды, который тоже можно получить и обработать в вызывающем пакетном файле ;)
«exit» позволяет указать код возврата, который можно получить и обработать в вызывающем пакетном файле.
»
GoTo:EOF сохраняет код возврата последней команды, который тоже можно получить и обработать в вызывающем пакетном файле ;) »
Так , что получается - без разницы , что указывать ?
Так , что получается - без разницы , что указывать ? »
- если Вы не собираетесь обрабатывать ошибки - без разницы;
- если результат процедуры зависит всего от одной команды (типа REN), то достаточно GoTo:EOF, но только сразу после неё, иначе другая команда перезапишет код ошибки;
- если результат процедуры зависит от нескольких команд, других условий либо Вы хотите ввести свою нумерацию исключительных ситуаций, то Exit/B.
Пришло время навести порядок в картинках. Суть в том, что есть многоуровневая структура вложенных папок. В последней папке лежат файлы *.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
SendMessage
28-09-2011, 15:16
Необходимо переименовать файлы по имени папки, в которой они лежат с порядковым номером и соответствующим разрешением. »
@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, Спасибо, то, что надо! Если не сложно, поясните его пожалуйста.
Моей фантазии пока хватило на это:
@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"
Скрипт не доработан, т.к. пока не додумал как нумеровать файлы отдельно в каждой папке начиная с первого. Может и мои ошибки покажете.
SendMessage
28-09-2011, 17:54
Если не сложно, поясните его пожалуйста. »
Попробую:
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 и начинает обрабатываться следующая папка.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.