Показать полную графическую версию : переименование группы файлов с запросом начального номера и перемещение
kozikozi
27-07-2014, 15:54
Всем привет! Есть идея написать BAT-ник, который переименует все *.jpg лежащие в одной папке с ним в name_трехзначный номер.jpg. Но с запросом с какого номера начать отсчитывать, т.е. мне надо начинать переименовывать не с начального значения: name_001.jpg, а со значения например: name_048.jpg и далее он сам прибавляет единицу: name_049.jpg, name_050.jpg. А в конце переименовывания перемещает все *.jpg в папку по назначенному пути, который так же запрашивает. Вот что есть на данный момент:
setlocal
set /p cnt="Введите начальное значение: "
for %%i in (*.jpg) do call:rename "%%i"
goto:eof
:rename
set /a cnt+=1
set "pref=00%cnt%"
ren %1 "name_%pref:~-3%.jpg"
set /p p="Введите путь перемещения: "
move /-y "*.jpg" %%p
Но естественно не работает как надо, пока что только переименовывает начиная с name_001.jpg и всё..
@echo off
setlocal
set /p cnt="Введите начальное значение: "
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
call:rename "%%i"
)
set /p p="Введите путь перемещения: "
move *.jpg "%p%">nul
endlocal
goto:eof
:rename
set pref=00%cnt%
ren %1 "name_%pref:~-3%.jpg"
set /a cnt+=1
goto:eof
kozikozi, подобные вещи удобнее всего делать в полуавтоматическом режиме посредством файлового менеджера — не будет проблем ни с совпадением результирующих имён файлов с уже существующими, ни с перемещением на другой раздел.
kozikozi
27-07-2014, 18:43
Georgio, большое спасибо!! всё как надо! а не могли бы вы написать, что за что отвечает? с моими малыми знаниями в bat языке это бы не помешало, ради интереса.
Iska, это понятно конечно, но хотелось именно так =)
kiripanda
28-07-2014, 19:07
"Копирование с переименовыванием по счетчику" http://forum.wincmd.ru/viewtopic.php?t=13230
Нет, я бы, конечно, промолчал, коль автор не изъявил желания, но теперь ;)… Far Manager + Visual renaming — Визуальное переименование файлов (http://forum.farmanager.com/viewtopic.php?f=11&t=2809):
http://i.imgur.com/Q8Kn34H.png
kozikozi
28-07-2014, 21:37
"Копирование с переименовыванием по счетчику" http://forum.wincmd.ru/viewtopic.php?t=13230
Да, спасибо.. но мне просто интересно, что например выполняют коды: setlocal и endlocal, а так же в принципе всё остальное.. грубо говоря объяснить на пальцах, например:
set /p cnt="Введите начальное значение: " - установка переменной
Нет, я бы, конечно, промолчал, коль автор не изъявил желания, но теперь … Far Manager + Visual renaming — Визуальное переименование файлов:
читать дальше » »
Спасибо, но смысл был в том, что бы без использования сторонних утилит.. И именно извращенным способом :) . Ведь при острой нехватки времени и необходимости, можно подрихтовать код и написать дополнительно .ini файл.. фотоаппарат вставляешь, он сам автоматически переименует и перекинет :) , и опять же, все в извращенной форме :maniac:
но мне просто интересно, что например выполняют коды: setlocal и endlocal, а так же в принципе всё остальное.. »
Попробуйте запустить командную строку и там исполнить:
setlocal /?
и:
endlocal /?
а так же в принципе всё остальное.. »
Аналогично вышеизложенному.
Лучше Вы загрузите справку: Download Windows Command Reference from Official Microsoft Download Center (http://www.microsoft.com/en-us/download/details.aspx?id=2632), разблокируйте (http://www.manhunter.ru/software/543_kak_razblokirovat_chm_fayli_v_windows_7.html) её, изучите, а затем укажите, что конкретно непонятно в вышеприведённом коде.
Ведь при острой нехватки времени и необходимости, можно подрихтовать код и написать дополнительно .ini файл.. »
Как раз наоборот. И именно при острой нехватке времени ;). Впрочем, это сугубо моё мнение.
фотоаппарат вставляешь, он сам автоматически переименует и перекинет »
Обратите внимание на это (http://forum.oszone.net/post-1880940.html#post1880940).
kozikozi
29-07-2014, 01:24
Попробуйте запустить командную строку и там исполнить: »
да в принципе так и делаю, вот только всё равно понять не могу, как работает команда goto:eof, это вроде бы вызывает передачу управления на метку :eof. Но в коде нет метки :eof. В общем только это осталось мне не понятным в коде
как работает команда goto:eof, это вроде бы вызывает передачу управления на метку :eof. Но в коде нет метки :eof. »
…
Изменение команды GOTO при включении расширенной обработки команд:
Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывает передачу управления в конец текущего пакетного файла. Это позволяет легко выйти из пакетного файла без определения каких-либо меток.
…
kozikozi
29-07-2014, 01:52
goto /? »
это я прочел в справке, но все равно понять не могу, как же он тогда тут работает?
@echo off
setlocal
set /p cnt="Введите начальное значение: "
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
call:rename "%%i"
)
set /p p="Введите путь перемещения: "
move *.jpg "%p%">nul
endlocal
goto:eof
:rename
set pref=00%cnt%
ren %1 "name_%pref:~-3%.jpg"
set /a cnt+=1
goto:eof
особенно часть:
:rename
set pref=00%cnt%
ren %1 "name_%pref:~-3%.jpg"
set /a cnt+=1
goto:eof
Выполняется переименование файла, потом к переменной прибавляется единица ии.. передает управление в конец.. это же и так конец? куда он управление передает?
А… Тут всё интереснее. Надо ещё читать «call /?»:
…
Изменение команды CALL при включении расширенной обработки команд:
Команда CALL допускает использование меток в качестве адресата вызова.
Применяется следующий синтаксис:
CALL :метка аргументы
При вызове создается новый контекст текущего пакетного файла с заданными
аргументами, и управление передается на инструкцию, расположенную сразу после
метки. Для выхода из такого пакетного файла необходимо дважды достичь
его конца. Первый выход возвращает управление на инструкцию, расположенную
сразу после строки CALL, а второй выход завершает выполнение пакетного файла.
…
http://i.imgur.com/a08mFLp.png
При вызове «call :rename "%%i"» создаётся новый контекст текущего пакетного файла и управление передаётся за метку «:rename».
Исполняется код после метки «:rename». Как исполнение доходит до «goto :eof» (второго) — происходит передача управления в конец пакетного файла и тем самым — завершение текущего («нового» из предыдущего пункта) контекста, и управление возвращается на следующую после вызывавшего «call» инструкцию.
Продолжается исполнение пакетного файла, вплоть до «goto :eof» (первого), который аналогично передаёт управление в конец пакетного файла и завершает его работу.
kozikozi
29-07-2014, 03:35
А… Тут всё интереснее. Надо ещё читать «call /?»: »
Вот это сильно.. Всё стало сразу понятно как это работает, большое спасибо!!
Вот еще вопросик возник, решил сделать еще проверку введенного пути (код проверки нашел на форуме), вышло вот что:
@echo off
setlocal
set /p cnt="Какого начальное значение: "
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
call:rename "%%i"
)
:prov
set /p p="Введите путь перемещения: "
if exist %p% goto next
goto main
:next
move *.jpg "%p%">nul
endlocal
goto:eof
:rename
set pref=00%cnt%
ren %1 "name_%pref:~-3%.jpg"
set /a cnt+=1
goto:eof
:main
echo Данный путь: "%p%" не найден, повторите попытку
goto prov
Что странно с моими знаниями в bat языке, оно работает как надо, а сам вопрос состоит в том, нельзя ли было сделать проверку проще? :cool:
kozikozi
29-07-2014, 15:53
А так же интересно стало.. что то сразу не приметил. Вот здесь:
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
call:rename "%%i"
)
мы создаем переменную, в ней собственно создаем список всех *.jpg файлов в папке и переходим к метке :rename передавая ей переменную i, но когда смотрим метку :rename
:rename
set pref=00%cnt%
ren %1 "name_%pref:~-3%.jpg"
set /a cnt+=1
goto:eof
то видим что она работает с переменной 1... так и должно быть?
мы создаем переменную, в ней собственно создаем список всех *.jpg файлов в папке »
Нет. мы получаем в «dir /a-d/b *.jpg 2>nul» набор строк, затем по «for /f» разбираем его на строки (поскольку «"delims="» — используется вся строка целиком, а не какие-то её отдельные части), и затем для каждой строки вызываем процедуру «call :rename».
и переходим к метке :rename передавая ей переменную i, но когда смотрим метку :rename … то видим что она работает с переменной 1... так и должно быть? »
Разумеется. Мы передаём не переменную «%%i», а её содержимое. Внутри нового контекста (помните?) в «:rename» первый переданный параметр будет доступен именно как «%1».
kozikozi
29-07-2014, 16:09
Спасибо.. понятно.. А как на счет: а сам вопрос состоит в том, нельзя ли было сделать проверку проще? »
и я вот еще с чем начал путаться, работая с переменной, ее где то обозначают: %i% или же %%i, а в чем разница?
и я вот еще с чем начал путаться, работая с переменной, ее где то обозначают: %i% или же %%i, а в чем разница? »
Это две разные переменные. Причём вторая — регистрозависима и доступна только внутри того цикла разбора, где она определена.
kozikozi
29-07-2014, 17:02
Это две разные переменные. Причём вторая — регистрозависима и доступна только внутри того цикла разбора, где она определена. »
Большое спасибо. И еще выплыл маленький вопрос:
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
call:rename "%%i"
)
цифра 2 здесь что дает?
цифра 2 здесь что дает? »
Перенаправление стандартного потока ошибок (Стандартные потоки — Википедия (http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0 %B8)) на пустое устройство (Null device - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/NUL:)).
Фактическим результатом является подавление появления сообщений об ошибках (отсутствующий каталог, не найдено файлов и пр.), которые таким образом не попадают ошибочно в разбор по «for /f».
kozikozi
29-07-2014, 19:31
Перенаправление стандартного потока ошибок (Стандартные потоки — Википедия) на пустое устройство (Null device - Wikipedia, the free encyclopedia). »
уяснил, большое спасибо! очень помогли :yes:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.