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

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

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

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


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

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


Добрый день.
Пытаюсь написать батник, который будет перебирать файлы в конкретной папке и, используя часть имени файла (а именно фамилию человека), находить уже существующую папку, название которой содержит часть имени файла (фамилию), куда и перемещать указанный файл.
Не могу разобраться с форматом записи и как правильно присваивать значения переменным.
Код: Выделить весь код
cls
chcp 1251
@echo off
set "tr=C:\Users\VML\OneDrive\Приказы" - это я упрощаю использование пути
for %%a in ("%tr%"\*.jpg) do (                 - перебор файлов jpeg
	set "fn=%%a"                                   - присваиваю новой переменной значение переменной из for, чтобы из нее м.б. извлечь фамилию
	set "sn=%%fn:%tr%=%%"              - первым делом пытаюсь удалить путь к файлу, чтобы осталось только его имя, НО ЗДЕСЬ в итоге ничего и не получается
	echo %sn%
)
set tr=                                                       - удаляю использованные переменные
set sn=
set fn=
Далее я хочу подставить фамилию в маску папки при копировании, но мне хотя бы как-то с переменными разобраться, чтобы с ними м.б. работать дальше.
Прошу строго не судить.

Отправлено: 13:49, 21-03-2017

 

Ветеран


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

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


Цитата londondron:
используя часть имени файла (а именно фамилию человека) »
Какую часть? Как выглядят имена файлов, как в них определить, что вот эта часть — фамилия?

Цитата londondron:
находить уже существующую папку »
Где находить?

Отправлено: 14:32, 21-03-2017 | #2



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

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


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


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

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


файлы имеют такой формат: "Фамилия_Прием.jpg"
Папки с фамилиями расположены в папке: "C:\Users\VML\OneDrive\ЛИЧНЫЕ ДЕЛА\" и имеют формат "00-00-00 Фамилия".

Отправлено: 14:45, 21-03-2017 | #3


Ветеран


Contributor


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

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


londondron,
1. как понять слово Прием в имени файла? Оно неизменно присутствует в каждом имени или это некое слово, которое индивидуально для каждого файла?
2. В имени файла только один символ подчёркивания?
3. А в папке, куда перемещаем файл, не может быть такого же более раннего?
4. А однофамильцы учитываются?
5. А если папки нет, её создавать? А что такое 00-00-00?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 21-03-2017 в 19:55.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:36, 21-03-2017 | #4


Ветеран


Contributor


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

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


londondron,Вот код по Вашему заданию.
1. Файлы называются *_Прием.jpg Фамилия отделяется символом _ подчёркивания. В фамилии не может быть _
2. Если в выходной папке уже присутствует файл с совпадающим именем, файл не перемещается
3. Если папки нет, файл не перемещается.
Как описАли, так и сделано
Код: Выделить весь код
@Echo Off

chcp 1251 >nul

Set "BoxIn=Z:\Users\VML\OneDrive\Приказы"
Set "MaskIn=*_Прием.jpg"

Set "BoxOut=Z:\Users\VML\OneDrive\ЛИЧНЫЕ ДЕЛА" 
Set "MaskOut=??-??-?? "

FOR /F "usebackq delims=" %%f IN (`Dir "%BoxIn%\%MaskIn%" /B /A:-D 2^>nul`) DO (
	FOR /F "tokens=1 delims=_" %%i IN ("%%f") DO (
		FOR /F "usebackq delims=" %%d IN (`Dir "%BoxOut%\%MaskOut%%%i" /B /A:D 2^>nul`) DO (
			Move "%BoxIn%\%%f" "%BoxOut%\%%d\" >nul
		)
	)
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 20:40, 21-03-2017 | #5


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


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

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


Спасибо!
Все именно так, как Вы написали в последнем посте.
Сейчас буду пробовать и разбираться. Потом отпишусь.

Отправлено: 06:44, 22-03-2017 | #6


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


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

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


Я понял: Вы разбили каждую строку первого вывода команды DIR на подстроки во втором цикле и получили фамилии, которые в 3-м цикле подставили к маске папок, предназначенных для перемещения. Отлично!
Спасибо, задача решена, и я более менее разобрался в команде FOR, наконец-то понятно, для чего usebackq нужен.
Однако, так и не разобрался, хотя хотелось бы, каковы возможности работы с переменными цикла. Вообще можно ли их значения присвоить обычным переменным, затем проводить с этими обычными переменными манипуляции (обрезать, заменять и т.п.) Тогда возможно было бы выполнить эти манипуляции в рамках одного цикла? Или в CMD это невозможно, или будет еще сложнее?
Еще раз спасибо.

Отправлено: 07:43, 22-03-2017 | #7


Ветеран


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

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


Цитата londondron:
и я более менее разобрался в команде FOR, наконец-то понятно, для чего usebackq нужен. »
Так для чего?

Цитата londondron:
каковы возможности работы с переменными цикла. Вообще можно ли их значения присвоить обычным переменным, »
Можно.

Цитата londondron:
затем проводить с этими обычными переменными манипуляции (обрезать, заменять и т.п.) »
Можно. Главное, не забывать, что раскрытие переменных окружения по %…% происходит в момент входа в операторные скобки. Потому требуется либо двойное раскрытие по call … %%SomeVar%%, либо enabledelayedexpansion и !SomeVar!.

Цитата londondron:
Тогда возможно было бы выполнить эти манипуляции в рамках одного цикла? »
Где Вы, полагаете, лишние циклы в коде?

Отправлено: 07:51, 22-03-2017 | #8


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


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

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


Цитата Iska:
Так для чего? »
usebackq - режим обработки кавычек. Строка, заключенная в обратные кавычки, выполняется как команда, строка, заключенная в прямые одиночные кавычки, является строкой символов, а двойные кавычки могут использоваться для задания имен файлов, содержащих пробелы.
Цитата Iska:
Можно. Главное, не забывать, что раскрытие переменных окружения по %…% происходит в момент входа в операторные скобки. Потому требуется либо двойное раскрытие по call … %%SomeVar%%, либо enabledelayedexpansion и !SomeVar!. »
Это для меня немного труднее. С наскока не разберусь.
Цитата Iska:
Где Вы, полагаете, лишние циклы в коде? »
Извиняюсь, не сразу разобрал последний FOR, поэтому не сразу понял, зачем 2-й DIR.
Получается, что в MOVE задать путь для перемещения файлов маской невозможно, для этого вызывается DIR 2-й раз.
Но... 1-й и 2-й FOR я все-таки объединил, т.к. из 1-й команды DIR сразу можно взять фамилии, стоящие до знака "_", а затем подставить их перед маской перемещаемых файлов в MOVE.
Без 2-го DIR, при том обстоятельстве, что невозможно использовать маску В ПУТИ НАЗНАЧЕНИЯ КОМАНДЫ MOVE, конечно не обойтись.
Вот мой код (здесь переменные цикла немного другие, а %BoxOut2% - заданный путь внутри папки - в вопросе я его, упрощая, не писал, т.к. хотел понять главное)
Код: Выделить весь код
for /f "usebackq tokens=1 delims=_" %%a in (`dir "%BoxIn%\%MaskIn%" /b /a:-d`) do (
	for /f "usebackq delims=" %%b in (`dir "%BoxOut%\%MaskOut%%%a" /b /a:d`) do move "%BoxIn%\%%a%MaskIn%" "%BoxOut%\%%b\%BoxOut2%\"
	)

Отправлено: 10:48, 22-03-2017 | #9


Ветеран


Contributor


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

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


londondron, значения переменных цикл можно присвоить обычным переменным, затем проводить с этими обычными переменными манипуляции (обрезать, заменять и т.п.) , например
Код: Выделить весь код
@Echo Off
cls

SetLocal EnableExtensions EnableDelayedExpansion

FOR %%d IN (01.34.6789 31.02.1812 22.03.2017) DO (
	Set "TData=%%d"
	Set "DD=!TData:~0,2!
	Set "MM=!TData:~3,2!
	Set "YYYY=!TData:~6,4!
	Echo %%d  !DD!  !MM!  !YYYY!  
)


pause

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:52, 22-03-2017 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создание папок на основе имен файлов и перемещение файлов в эти папки mezzin Скриптовые языки администрирования Windows 4 10-12-2016 21:11
VBS/WSH/JS - [решено] перемещение N файлов из папки в папку Romano Скриптовые языки администрирования Windows 5 06-12-2011 21:08
CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла Sarge81 Скриптовые языки администрирования Windows 4 20-09-2011 04:20
VBS/WSH/JS - Перемещение файлов и папок в разные папки... WalkManX Скриптовые языки администрирования Windows 0 07-08-2011 22:37
CMD/BAT - [решено] Перемещение устаревших файлов из папки в резервную папку zavoruev Скриптовые языки администрирования Windows 22 28-05-2010 14:04




 
Переход