Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   переименование группы файлов с запросом начального номера и перемещение (http://forum.oszone.net/showthread.php?t=285644)

kozikozi 27-07-2014 15:54 2381857

переименование группы файлов с запросом начального номера и перемещение
 
Всем привет! Есть идея написать 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 и всё..

Georgio 27-07-2014 16:42 2381865

Код:

@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


Iska 27-07-2014 17:38 2381881

kozikozi, подобные вещи удобнее всего делать в полуавтоматическом режиме посредством файлового менеджера — не будет проблем ни с совпадением результирующих имён файлов с уже существующими, ни с перемещением на другой раздел.

kozikozi 27-07-2014 18:43 2381907

Georgio, большое спасибо!! всё как надо! а не могли бы вы написать, что за что отвечает? с моими малыми знаниями в bat языке это бы не помешало, ради интереса.

Iska, это понятно конечно, но хотелось именно так =)

kiripanda 28-07-2014 19:07 2382391

"Копирование с переименовыванием по счетчику" http://forum.wincmd.ru/viewtopic.php?t=13230

Iska 28-07-2014 21:26 2382432

Нет, я бы, конечно, промолчал, коль автор не изъявил желания, но теперь ;)… Far Manager + Visual renaming — Визуальное переименование файлов:

kozikozi 28-07-2014 21:37 2382441

Цитата:

"Копирование с переименовыванием по счетчику" http://forum.wincmd.ru/viewtopic.php?t=13230
Да, спасибо.. но мне просто интересно, что например выполняют коды: setlocal и endlocal, а так же в принципе всё остальное.. грубо говоря объяснить на пальцах, например:
Код:

set /p cnt="Введите начальное значение: " - установка переменной
Цитата:

Цитата Iska
Нет, я бы, конечно, промолчал, коль автор не изъявил желания, но теперь … Far Manager + Visual renaming — Визуальное переименование файлов:
читать дальше » »

Спасибо, но смысл был в том, что бы без использования сторонних утилит.. И именно извращенным способом :) . Ведь при острой нехватки времени и необходимости, можно подрихтовать код и написать дополнительно .ini файл.. фотоаппарат вставляешь, он сам автоматически переименует и перекинет :) , и опять же, все в извращенной форме :maniac:

Iska 29-07-2014 00:29 2382507

Цитата:

Цитата kozikozi
но мне просто интересно, что например выполняют коды: setlocal и endlocal, а так же в принципе всё остальное.. »

Попробуйте запустить командную строку и там исполнить:
Код:

setlocal /?
и:
Код:

endlocal /?
Цитата:

Цитата kozikozi
а так же в принципе всё остальное.. »

Аналогично вышеизложенному.

Лучше Вы загрузите справку: Download Windows Command Reference from Official Microsoft Download Center, разблокируйте её, изучите, а затем укажите, что конкретно непонятно в вышеприведённом коде.

Цитата:

Цитата kozikozi
Ведь при острой нехватки времени и необходимости, можно подрихтовать код и написать дополнительно .ini файл.. »

Как раз наоборот. И именно при острой нехватке времени ;). Впрочем, это сугубо моё мнение.


Цитата:

Цитата kozikozi
фотоаппарат вставляешь, он сам автоматически переименует и перекинет »

Обратите внимание на это.

kozikozi 29-07-2014 01:24 2382516

Цитата:

Цитата Iska
Попробуйте запустить командную строку и там исполнить: »

да в принципе так и делаю, вот только всё равно понять не могу, как работает команда goto:eof, это вроде бы вызывает передачу управления на метку :eof. Но в коде нет метки :eof. В общем только это осталось мне не понятным в коде

Iska 29-07-2014 01:42 2382517

Цитата:

Цитата kozikozi
как работает команда goto:eof, это вроде бы вызывает передачу управления на метку :eof. Но в коде нет метки :eof. »

goto /?
Цитата:


Изменение команды GOTO при включении расширенной обработки команд:

Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывает передачу управления в конец текущего пакетного файла. Это позволяет легко выйти из пакетного файла без определения каких-либо меток.


kozikozi 29-07-2014 01:52 2382521

Цитата:

Цитата Iska
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

Выполняется переименование файла, потом к переменной прибавляется единица ии.. передает управление в конец.. это же и так конец? куда он управление передает?

Iska 29-07-2014 03:03 2382538

А… Тут всё интереснее. Надо ещё читать «call /?»:
Цитата:


Изменение команды CALL при включении расширенной обработки команд:

Команда CALL допускает использование меток в качестве адресата вызова.
Применяется следующий синтаксис:
Код:

CALL :метка аргументы
При вызове создается новый контекст текущего пакетного файла с заданными
аргументами, и управление передается на инструкцию, расположенную сразу после
метки
. Для выхода из такого пакетного файла необходимо дважды достичь
его конца. Первый выход возвращает управление на инструкцию, расположенную
сразу после строки CALL, а второй выход завершает выполнение пакетного файла.


  • При вызове «call :rename "%%i"» создаётся новый контекст текущего пакетного файла и управление передаётся за метку «:rename».
  • Исполняется код после метки «:rename». Как исполнение доходит до «goto :eof» (второго) — происходит передача управления в конец пакетного файла и тем самым — завершение текущего («нового» из предыдущего пункта) контекста, и управление возвращается на следующую после вызывавшего «call» инструкцию.
  • Продолжается исполнение пакетного файла, вплоть до «goto :eof» (первого), который аналогично передаёт управление в конец пакетного файла и завершает его работу.

kozikozi 29-07-2014 03:35 2382545

Цитата:

Цитата Iska
А… Тут всё интереснее. Надо ещё читать «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 2382802

А так же интересно стало.. что то сразу не приметил. Вот здесь:
Код:

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... так и должно быть?

Iska 29-07-2014 16:03 2382807

Цитата:

Цитата kozikozi
мы создаем переменную, в ней собственно создаем список всех *.jpg файлов в папке »

Нет. мы получаем в «dir /a-d/b *.jpg 2>nul» набор строк, затем по «for /f» разбираем его на строки (поскольку «"delims="» — используется вся строка целиком, а не какие-то её отдельные части), и затем для каждой строки вызываем процедуру «call :rename».

Цитата:

Цитата kozikozi
и переходим к метке :rename передавая ей переменную i, но когда смотрим метку :rename … то видим что она работает с переменной 1... так и должно быть? »

Разумеется. Мы передаём не переменную «%%i», а её содержимое. Внутри нового контекста (помните?) в «:rename» первый переданный параметр будет доступен именно как «%1».

kozikozi 29-07-2014 16:09 2382813

Спасибо.. понятно.. А как на счет:
Цитата:

Цитата kozikozi
а сам вопрос состоит в том, нельзя ли было сделать проверку проще? »

и я вот еще с чем начал путаться, работая с переменной, ее где то обозначают: %i% или же %%i, а в чем разница?

Iska 29-07-2014 16:23 2382824

Цитата:

Цитата kozikozi
и я вот еще с чем начал путаться, работая с переменной, ее где то обозначают: %i% или же %%i, а в чем разница? »

Это две разные переменные. Причём вторая — регистрозависима и доступна только внутри того цикла разбора, где она определена.

kozikozi 29-07-2014 17:02 2382843

Цитата:

Цитата Iska
Это две разные переменные. Причём вторая — регистрозависима и доступна только внутри того цикла разбора, где она определена. »

Большое спасибо. И еще выплыл маленький вопрос:
Код:

for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
 call:rename "%%i"
 )

цифра 2 здесь что дает?

Iska 29-07-2014 17:41 2382857

Цитата:

Цитата kozikozi
цифра 2 здесь что дает? »

Перенаправление стандартного потока ошибок (Стандартные потоки — Википедия) на пустое устройство (Null device - Wikipedia, the free encyclopedia).

Фактическим результатом является подавление появления сообщений об ошибках (отсутствующий каталог, не найдено файлов и пр.), которые таким образом не попадают ошибочно в разбор по «for /f».

kozikozi 29-07-2014 19:31 2382911

Цитата:

Цитата Iska
Перенаправление стандартного потока ошибок (Стандартные потоки — Википедия) на пустое устройство (Null device - Wikipedia, the free encyclopedia). »

уяснил, большое спасибо! очень помогли :yes:


Время: 23:52.

Время: 23:52.
© OSzone.net 2001-