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

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

Ответить
Настройки темы
CMD/BAT - переименование группы файлов с запросом начального номера и перемещение

Новый участник


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

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


Изменения
Автор: kozikozi
Дата: 27-07-2014
Всем привет! Есть идея написать 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 и всё..

Отправлено: 15:54, 27-07-2014

 

Новый участник


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

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


Цитата 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
Выполняется переименование файла, потом к переменной прибавляется единица ии.. передает управление в конец.. это же и так конец? куда он управление передает?

Отправлено: 01:52, 29-07-2014 | #11



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

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


Ветеран


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

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


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

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

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

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

Отправлено: 03:03, 29-07-2014 | #12


Новый участник


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

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


Цитата 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 языке, оно работает как надо, а сам вопрос состоит в том, нельзя ли было сделать проверку проще?

Последний раз редактировалось kozikozi, 29-07-2014 в 15:17. Причина: подрихтовал


Отправлено: 03:35, 29-07-2014 | #13


Новый участник


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

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


А так же интересно стало.. что то сразу не приметил. Вот здесь:
Код: Выделить весь код
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... так и должно быть?

Отправлено: 15:53, 29-07-2014 | #14


Ветеран


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

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


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

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

Отправлено: 16:03, 29-07-2014 | #15


Новый участник


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

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


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

Отправлено: 16:09, 29-07-2014 | #16


Ветеран


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

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


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

Отправлено: 16:23, 29-07-2014 | #17


Новый участник


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

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


Цитата Iska:
Это две разные переменные. Причём вторая — регистрозависима и доступна только внутри того цикла разбора, где она определена. »
Большое спасибо. И еще выплыл маленький вопрос:
Код: Выделить весь код
for /f "delims=" %%i in ('
"dir /a-d/b *.jpg 2>nul"
') do (
 call:rename "%%i"
 )
цифра 2 здесь что дает?

Отправлено: 17:02, 29-07-2014 | #18


Ветеран


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

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


Цитата kozikozi:
цифра 2 здесь что дает? »
Перенаправление стандартного потока ошибок (Стандартные потоки — Википедия) на пустое устройство (Null device - Wikipedia, the free encyclopedia).

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

Отправлено: 17:41, 29-07-2014 | #19


Новый участник


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

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


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

Отправлено: 19:31, 29-07-2014 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Переименование группы файлов, используя команды bat SergMarkow Скриптовые языки администрирования Windows 0 20-01-2013 23:23
CMD/BAT - Переименование группы файлов по дате создания Serg2010 Скриптовые языки администрирования Windows 8 14-04-2012 00:40
Переименование группы файлов по дате создания Serg2010 AutoIt 1 10-04-2012 10:25
CMD/BAT - [решено] Переименование файлов с указанием порядкового номера shao Скриптовые языки администрирования Windows 38 28-09-2011 17:54




 
Переход