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

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

Ответить
Настройки темы
CMD/BAT - [решено] Копирование фото из папки №2 в папку №1 на основании сравнения

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


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

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


Добрый день.
Нужна помощь в решении следующего вопроса:
Есть 2 сетевых хранилища (далее №1 и №2) с изображениями.
Интересующие изображения имеют формат имени 1234_100_1.jpg (код_id_номер фото - код и id любые числа), причём в хранилище №1 они лежат все в одной папке, а в хранилище №2 в разных.
Необходимо сравнить оба хранилища по наличию jpg с одинаковыми именами, игнорируя файлы другого расширения и jpg с текстом в имени, например 111_название_1 или 111_222_1-2.
Если находится файл с одинаковым именем, например 228_145_1.jpg, то копируем из хранилища №2 все фото с этим кодом и id, то есть 228_145_2.jpg 228_145_3.jpg и тд в хранилище №1.

Отправлено: 15:11, 10-12-2019

 

Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
	Set "Dir1=\\Server1\Test1"
	Set "Dir2=\\Server2\Test2"

	Set "Ext=jpg"
	Set "Mask=[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9]_[0-9]"

	>"%Dir1%\%~nx0.tmp" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
		For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%" ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%f)
	))

	For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%" ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (
		Call Set "Ffile=%%~nf"
		>nul 2>&1 FINDSTR /I /C:"\%%f" "%Dir1%\%~nx0.tmp" &&Call :MyCopy "\\%%Ffile:~0,-1%%[0-9]\.%Ext%$" "%Dir1%\%~nx0.tmp"
	)
	2>nul Del "%Dir1%\%~nx0.tmp"
Exit /B 0

:MyCopy
	For /F "usebackq delims=" %%g In (`2^>nul FINDSTR /I /R /C:%1 %2`) Do >nul Copy "%%g" "%~dp2" 
Exit /B
Боюсь, при большом количестве файлов процесс займет значительное время

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

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

Отправлено: 19:45, 10-12-2019 | #2



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

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


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


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

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


megaloman, спасибо, завтра опробую.
Вопрос по маске Set "Mask=[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9]_[0-9]", в именах может быть разное количество цифр в части кода и id вплоть до 6 символов, возможно как-то это задать в маску?
В текущем исполнении, если правильно понял, будут искаться файлы с четырьмя - тремя - и одним символами.

Отправлено: 22:48, 10-12-2019 | #3


Ветеран


Contributor


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

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


Viberezh, Поставьте четко задачу: у меня решается задача для файлов формата 1234_123_1.jpg
Объясните, сколько знаков (min-max) может содержаться в каждой части имени, сейчас это жестко 4-3-1.

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

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

Отправлено: 23:17, 10-12-2019 | #4


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


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

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


megaloman, в первой части от 4 до 6 знаков, во второй от 1 до 6 знаков.
P.S.
Возможно по результату выполнения вывести в текстовой документ имена скопированных файлов?

Последний раз редактировалось Viberezh, 11-12-2019 в 12:48.


Отправлено: 08:32, 11-12-2019 | #5


Ветеран


Contributor


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

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


Вот вариант: во всех трёх частях число знаков произвольное. В выделенной строке закомментирована маска для фиксированного количества в 1 цифру в третей части. Если Вам надо так, уберите rem.
Чтобы не было недопонимания: берётся файл в первой папке и, если он имеется во второй папке, копируются в первую папку из второй все файлы с одинаковыми первой и второй частью имени.
Лог файл создаётся в первой папке под именем скрипта с расширением log
Код: Выделить весь код
@Echo Off
	Set "Dir1=\\Server\Test1"
	Set "Dir2=\\Server\Test2"

	Set "Ext=jpg"

	Set "Mask=[0-9]*_[0-9]*_[0-9]*"
rem	Set "Mask=[0-9]*_[0-9]*_[0-9]"

	Set "Log=%Dir1%\%~nx0.log"

	>"%Dir1%\%~nx0.tmp1" (For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%i))

	>"%Dir1%\%~nx0.tmp2" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
		For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%i)
	))

	>"%Log%" Echo %Date% %Time%

	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul more "%Dir1%\%~nx0.tmp1"`) Do (
		>nul 2>nul FINDSTR /I /R /C:"\\%%i_%%j_%%k\.%%l$" "%Dir1%\%~nx0.tmp2" &&(
			For /F "usebackq delims=" %%f In (`2^>nul more "%Dir1%\%~nx0.tmp2" ^|FINDSTR /I /R /C:"\\%%i_%%j_[0-9]*\.%%l$"`) Do (
				If Not Exist "%Dir1%\%%~nxf" (>nul Copy "%%f" "%Dir1%\" &>>"%Log%" Echo %%f)
			)
		)
	)
	>>"%Log%" Echo %Date% %Time%

	2>nul Del "%Dir1%\%~nx0.tmp1"
	2>nul Del "%Dir1%\%~nx0.tmp2"
Exit /B 0

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


Последний раз редактировалось megaloman, 11-12-2019 в 14:45. Причина: Добавил в лог-файл запись даты и времени

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

Отправлено: 13:55, 11-12-2019 | #6


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


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

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


megaloman, дополнение к задаче:
Настроил копирование в другую папку Set "Dest=Name", нужно переименовать третью часть файлов после копирования по алгоритму: 1234_123_2.jpg = 1234_123_9.jpg; 1234_123_3.jpg = 1234_123_10.jpg и т.д. по возрастанию.
Возможно реализовать?
Заранее спасибо!
Скрытый текст

Код: Выделить весь код
@Echo Off
	Set "Dir1=\\Server\Test1"
	Set "Dir2=\\Server\Test2"
        Set "Dest=Name"

	Set "Ext=jpg"

	Set "Mask=[0-9]*_[0-9]*_[0-9]*"
rem	Set "Mask=[0-9]*_[0-9]*_[0-9]"

	Set "Log=%Dir1%\%~nx0.log"

	>"%Dir1%\%~nx0.tmp1" (For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%i))

	>"%Dir1%\%~nx0.tmp2" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
		For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%i)
	))

	>"%Log%" Echo %Date% %Time%

	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul more "%Dir1%\%~nx0.tmp1"`) Do (
		>nul 2>nul FINDSTR /I /R /C:"\\%%i_%%j_%%k\.%%l$" "%Dir1%\%~nx0.tmp2" &&(
			For /F "usebackq delims=" %%f In (`2^>nul more "%Dir1%\%~nx0.tmp2" ^|FINDSTR /I /R /C:"\\%%i_%%j_[0-9]*\.%%l$"`) Do (
				If Not Exist "%Dir1%\%%~nxf" (>nul Copy "%%f" "%Dest%\" &>>"%Log%" Echo %%f)
			)
		)
	)
	>>"%Log%" Echo %Date% %Time%

	2>nul Del "%Dir1%\%~nx0.tmp1"
	2>nul Del "%Dir1%\%~nx0.tmp2"
Exit /B 0

Отправлено: 14:06, 12-12-2019 | #7


Ветеран


Contributor


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

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


Цитата Viberezh:
Настроил копирование в другую папку Set "Dest=Name", »
Откуда копирование? Что в источнике: папка с кучей файлов или папка с подпапками? Или переименование надо сделать в вашей указанной папке
Set "Dest=Name",

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


Последний раз редактировалось megaloman, 12-12-2019 в 14:15.


Отправлено: 14:09, 12-12-2019 | #8


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


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

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


megaloman, переименовать скопированные файлы по результату работы Вашего скрипта, только не в папку Set "Dir1=\\Server\Test1" как было изначально, а в мою отдельную папку "Set Dest=Name"

Отправлено: 14:21, 12-12-2019 | #9


Ветеран


Contributor


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

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


Viberezh, Почему 2 переименовываем именно в 9? +7 - это задаваемая величина, или её надо как-то определить?
Я правильно понимаю: есть некая папка заданная в %Dest%, внутри папки надо все файлы с номерами, кроме 1, переименовать в номера +7 ?
А если есть ряд файлов _2 _5 _8 с дырками в нумерации, их во что переименовывать, в _9 _12 _15 или в _9 _10 _11 ?
Если просто добавлять +7 к имени, то в дополнение к Вашему (моему изменённому) скрипту
Код: Выделить весь код
....................
....................
	Set "Dest=Z:\Box_Out"
....................
....................
	2>nul Del "%Dir1%\%~nx0.tmp1"
	2>nul Del "%Dir1%\%~nx0.tmp2"

	Call :MyRen "%Dest%" "%Ext%" 7

Exit /B 0

:MyRen
	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
		Set /A Num=10000000+%%k+%3
		If Not %%k==1 If %%k LSS 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2" 
	)
	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
		Set /A Num=%%k-10000000
		If %%k GTR 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2" 
	)
Exit /B 0
Или отдельным скриптом
Код: Выделить весь код
@Echo Off
	Set "Dest=Z:\Box_Out"
	Set "Ext=jpg"

	Call :MyRen "%Dest%" "%Ext%" 7
Exit /B 0

:MyRen
	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
		Set /A Num=10000000+%%k+%3
		If Not %%k==1 If %%k LSS 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2" 
	)
	For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
		Set /A Num=%%k-10000000
		If %%k GTR 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2" 
	)
Exit /B 0

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


Последний раз редактировалось megaloman, 12-12-2019 в 20:40.

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

Отправлено: 17:42, 12-12-2019 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Копирование папки с файлами из сетевой папки Stgean Скриптовые языки администрирования Windows 10 24-04-2019 17:05
CMD/BAT - [решено] Копирование в/из текущую/ей папку/и 4zz Скриптовые языки администрирования Windows 13 18-01-2017 21:48
CMD/BAT - [решено] Копирование в папку исходя из вложенных файлов foma24 Скриптовые языки администрирования Windows 6 23-08-2012 09:10
CMD/BAT - [решено] Поиск папки и Копирование файла в данную папку из известного места dark-------13 Скриптовые языки администрирования Windows 4 20-04-2011 11:48
CMD/BAT - [решено] копирование файла Адресной книги из общей папки на сервере в профиль пользователя tlekkanapin Скриптовые языки администрирования Windows 5 18-04-2011 13:24




 
Переход