|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Копирование большого количества файлов по сети |
|
CMD/BAT - [решено] Копирование большого количества файлов по сети
|
Новый участник Сообщения: 42 |
Профиль | Отправить PM | Цитировать Добрый день, помогите пожалуйста с решением следующей задачки. Заранее прошу прощения, если уже были подобные вопросы, просьба кинуть ссылку или готовое решение, я искал и полностью похожей задачи не нашел.
Необходимо с одного ПК ископировать большое количество файлов (оснавная папка и подпапки) на другой ПК, находящийся в одной и той же сети (сетевой доступ между ПК есть). Размер основной папки большой, чуть более 200Гб. Содержит большое количество подпапок и мелких файлов. Т.е. с папки C:\Distr\Files\подпапки копировать на другой ПК в C:\Distr\Files\подпапки Копирование должно пройти быстро, в течении хотя бы 12 часов (этого будет достаточно). Но если возникнет необходимость повторного копирования, то копировать необходимо будет сделать только новые подпапки или файлы. Результат копирования, по возможности, лучше записать в лог, но без перечисления (т.к. боюсь это займет много времени и лог очень сильно вырастит), а как бы в процентном соотношении, что было скопировано всё в первом случае, и только новые файлы, во втором. |
|
Отправлено: 10:54, 12-10-2020 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать finderhd, Не прошло и полгода
И в самом деле, в корне папки Test1 файлы не копируются - моё недомыслие. Добавил это копирование: @Echo Off cls Set "BoxIn=\\192.168.100.23\Test1" Set "BoxOut=Z:\Box_Arc\Test1" Set "LogFile=Z:\Box_Arc\%~nx0.log" >>"%LogFile%" 2>>&1 ( Echo ==================================== %Date% %Time% "Start %~dpnx0" Echo %Date% %Time% Begin XCopy "%BoxIn%" Xcopy /D /Q /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\" Echo %Date% %Time% End XCopy "%BoxIn%" Echo. FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D "%BoxIn%"`) DO ( Echo %Date% %Time% Begin XCopy "%BoxIn%\%%d" Xcopy /D /Q /E /H /R /C /Y "%BoxIn%\%%d\*.*" "%BoxOut%\%%d\" Echo %Date% %Time% End XCopy "%BoxIn%\%%d" Echo. ) ) Цитата finderhd:
@Echo Off
cls
Set "BoxIn=\\192.168.100.23\Test1"
Set "BoxOut=Z:\Box_Arc\Test1"
Xcopy /D /Q /E /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\"
@Echo Off
cls
Set "BoxIn=\\192.168.100.23\Test1"
Set "BoxOut=Z:\Box_Arc\Test1"
Set "LogFile=Z:\Box_Arc\%~nx0.log"
>>"%LogFile%" 2>&1 (
Echo ==================================== %Date% %Time% "Start %~dpnx0"
Xcopy /D /Q /E /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\"
)
Цитата finderhd:
Rem Pause Надеюсь, Ваша реакция последует несколько раньше, чем Новый Год |
||
------- Отправлено: 13:53, 11-11-2020 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 22:51, 11-11-2020 | #12 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Согласен с Вами, альтернатива замечательная, спасибо, проверю этот вариант в самое ближайшее время и отпишусь о результатах. |
|
Отправлено: 11:36, 13-11-2020 | #13 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать Попробовал альтернативный способ - ничего не произошло. Если батник запускать из консоли, то ничего не происходит, но лог создается
В логе следующие записи: File not found - *.* 0 File(s) copied И еще вопрос - можно ли сделать так, чтобы атрибуты по дате создания каталогов, как в случае файлов (с файлами в этом плане всё нормально), сохранялись, а не отображались датой запуска батника? |
Отправлено: 12:04, 13-11-2020 | #14 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать finderhd, У Вас неверно указан исходный путь. Переименуйте Ваш батник в файл с расширением .txt и приложите к сообщению.
Вот вариант с проверкой существования исходного пути. @Echo Off
Set "BoxIn=\\192.168.100.23\Test1"
Set "BoxOut=Z:\Box_Arc\Test1"
Set "LogFile=Z:\Box_Arc\%~nx0.log"
>>"%LogFile%" 2>&1 (
Echo ==================================== %Date% %Time% "Start %~dpnx0"
If Not Exist "%BoxIn%\" Echo --- InBox not found "%BoxIn%" --- OutBox= "%BoxOut%"
Xcopy /D /Q /E /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\"
)
Exit /B
Вот пример моего Log-файла
Цитата:
При втором запуске ничего не скопировалось, так как всё уже было скопировано. В третем случае я нарочно указал неверную папку - получил сообщение как у Вас File not found - *.* 0 File(s) copied Так что неча на зеркало пенять Цитата finderhd:
|
||
------- Последний раз редактировалось megaloman, 13-11-2020 в 18:07. Отправлено: 15:26, 13-11-2020 | #15 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
В любом случае, теперь всё работает, спасибо! |
||
Отправлено: 10:42, 16-11-2020 | #16 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать Заметил еще один момент. В папку назначения копируются только вложенные папки, а исходная, которая указывается в батнике (Test1) не копируется, если её не указать в назначении, это не совсем удобно, если нужно выборочное копирование.
Т.е. можно к примеру сделать так, чтобы в папке назначения не указывать имя копируемого каталога? Set "BoxIn=\\192.168.100.23\Test1" Set "BoxOut=Z:\Box_Arc\ |
Отправлено: 13:21, 16-11-2020 | #17 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата finderhd:
@Echo Off Set "FromServer=\\192.168.100.23" Set "FromFolder=Test1\Дискета_от_книги\Chapter05" Set "BoxOut=Z:\Box_Arc" Set "LogFile=Z:\Box_Arc\%~nx0.log" >>"%LogFile%" 2>>&1 ( Echo ==================================== %Date% %Time% "Start %~dpnx0" Echo %Date% %Time% Begin XCopy "%FromServer%\%FromFolder%" Xcopy /D /Q /H /R /C /Y "%FromServer%\%FromFolder%\*.*" "%BoxOut%\%FromFolder%\" Echo %Date% %Time% End XCopy "%FromServer%\%FromFolder%" Echo. FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D "%FromServer%\%FromFolder%"`) DO ( Echo %Date% %Time% Begin XCopy "%FromServer%\%FromFolder%\%%d" Xcopy /D /Q /E /H /R /C /Y "%FromServer%\%FromFolder%\%%d\*.*" "%BoxOut%\%FromFolder%\%%d\" Echo %Date% %Time% End XCopy "%FromServer%\%FromFolder%\%%d" Echo. ) ) Exit /B @Echo Off Set "FromServer=\\192.168.100.23" Set "FromFolder=Test1\Дискета_от_книги\Chapter05" Set "BoxOut=Z:\Box_Arc" Set "LogFile=Z:\Box_Arc\%~nx0.log" >>"%LogFile%" 2>&1 ( Echo ==================================== %Date% %Time% "Start %~dpnx0" If Not Exist "%FromServer%\%FromFolder%\" Echo --- InBox not found "%FromServer%\%FromFolder%" --- OutBox= "%BoxOut%" Xcopy /D /Q /E /H /R /C /Y "%FromServer%\%FromFolder%\*.*" "%BoxOut%\%FromFolder%\" ) Exit /B \\192.168.100.23\Дискета_от_книги\Chapter05\ с подпапками, естественно, попадёт в Z:\Box_Arc\Test1\Дискета_от_книги\Chapter05 Папка при отсутствии будет создана. Можно сделать так: Получим Z:\Box_Arc\Тестовые_сетевые_папки\Test1\Дискета_от_книги\Chapter05 Можно эдак: Получим Z:\Box_Arc\Test1\Дискета_от_книги\Chapter05 А можно вообще извратиться, например, для копирования с разных серверов в одну папку с идентификацией сервера в копии Получим Z:\Box_Arc\192.168.100.23\Test1\Дискета_от_книги\Chapter05 |
|
------- Последний раз редактировалось megaloman, 26-11-2020 в 16:27. Отправлено: 15:11, 16-11-2020 | #18 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать megaloman,
Доброго дня. Оставил самый простой вариант, без лога, который @Echo Off cls Set "BoxIn=\\192.168.100.23\Test1" Set "BoxOut=Z:\Box_Arc\Test1" Xcopy /D /Q /E /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\" pause Exit /B Все отлично скопировалось. Но к задаче добавилось условие для некоторых других папок. Т.е. их как то выделять или добавлять отдельно в бат файл не нужно, я просто их сам укажу. Как с них по такому же сценарию скопировать файлы, но в зависимости от даты создания? Например, чтобы скопировались только файлы, созданные за последний месяц, год и т.д. в количестве дней, подскажите пожалуйста. |
Отправлено: 11:31, 26-11-2020 | #19 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать finderhd, Для xcopy
Цитата:
@Echo Off cls Set "BoxIn=\\192.168.100.23\Test1\тра ля ля\CMD_Forum" Set "BoxOut=Z:\Box_Arc\тра ля ля\CMD_Forum" Set /A DeltaDay=-31 FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "ToDay=%%d" &Call Set "ToDay=%%ToDay:~6,2%%.%%ToDay:~4,2%%.%%ToDay:~0,4%%" Call :FromDate %DeltaDay% %ToDay% "DDat" If Not Exist "%BoxIn%\" ( Echo --- InBox not found "%BoxIn%\" --- OutBox= "%BoxOut%" ) Else ( Xcopy /D:%DDat:~4,2%-%DDat:~6,2%-%DDat:~0,4% /Q /S /H /R /C /Y "%BoxIn%\*.*" "%BoxOut%\" ) pause Exit /B :FromDate rem Пересчет даты на заданное кол-во дней rem В первом аргументе +- дни rem Во втором аргументе дата в формате dd.mm.yyyy rem В третем аргументе имя переменной в кавычках где получим новую дату в формате yyyymmdd rem Заимствовано http://forum.oszone.net/thread-186889.html rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd" rem результат в перемменной %yyyymmdd% SetLocal Set "DT=%~2" Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11 Set /A J=J+2-12*L,I=100*(N-49)+I+L Set /A yyyy=I,mm=100+J,dd=100+K EndLocal& Set "%~3=%yyyy%%mm:~-2%%dd:~-2%" GoTo :Eof Здесь указываем число дней для пересчета текущей даты ("-" назад). Наверное можно то же сделать посредством forfiles. |
|
------- Последний раз редактировалось megaloman, 26-11-2020 в 16:33. Отправлено: 15:26, 26-11-2020 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - [решено] Проблема с просмотром большого количества файлов в explorer | Pikki-pikki | Microsoft Windows 2000/XP | 8 | 30-05-2021 00:24 | |
CMD/BAT - [решено] Удаление большого количества папок и файлов | finderhd | Скриптовые языки администрирования Windows | 50 | 12-10-2020 10:17 | |
Система - [решено] проверка целостности большого количества файлов | daneeall | Программное обеспечение Windows | 7 | 08-02-2013 16:25 | |
2008 R2 - Подвисает копирование файлов большого объема из сети | ujin | Windows Server 2008/2008 R2 | 2 | 07-10-2010 12:57 | |
Интерфейс - [решено] Переименование большого количества файлов | 7human7 | Microsoft Windows 2000/XP | 7 | 22-11-2008 09:48 |
|