|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Копирование фото из папки №2 в папку №1 на основании сравнения |
|
|
CMD/BAT - [решено] Копирование фото из папки №2 в папку №1 на основании сравнения
|
Новый участник Сообщения: 23 |
Профиль | Отправить 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 |
Ветеран Сообщения: 2703
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать Viberezh, Поставьте четко задачу: у меня решается задача для файлов формата 1234_123_1.jpg
Объясните, сколько знаков (min-max) может содержаться в каждой части имени, сейчас это жестко 4-3-1. |
------- Отправлено: 23:17, 10-12-2019 | #4 |
Новый участник Сообщения: 23
|
Профиль | Отправить PM | Цитировать megaloman, в первой части от 4 до 6 знаков, во второй от 1 до 6 знаков.
P.S. Возможно по результату выполнения вывести в текстовой документ имена скопированных файлов? |
|
Последний раз редактировалось Viberezh, 11-12-2019 в 12:48. Отправлено: 08:32, 11-12-2019 | #5 |
Ветеран Сообщения: 2703
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать Цитата Viberezh:
Set "Dest=Name", |
|
------- Последний раз редактировалось megaloman, 12-12-2019 в 14:15. Отправлено: 14:09, 12-12-2019 | #8 |
Новый участник Сообщения: 23
|
Профиль | Отправить PM | Цитировать megaloman, переименовать скопированные файлы по результату работы Вашего скрипта, только не в папку Set "Dir1=\\Server\Test1" как было изначально, а в мою отдельную папку "Set Dest=Name"
|
Отправлено: 14:21, 12-12-2019 | #9 |
Ветеран Сообщения: 2703
|
Профиль | Отправить 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 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|