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

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

Ответить
Настройки темы
CMD/BAT - [решено] Копирование большого количества файлов по сети

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


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

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


Добрый день, помогите пожалуйста с решением следующей задачки. Заранее прошу прощения, если уже были подобные вопросы, просьба кинуть ссылку или готовое решение, я искал и полностью похожей задачи не нашел.

Необходимо с одного ПК ископировать большое количество файлов (оснавная папка и подпапки) на другой ПК, находящийся в одной и той же сети (сетевой доступ между ПК есть).
Размер основной папки большой, чуть более 200Гб. Содержит большое количество подпапок и мелких файлов. Т.е. с папки C:\Distr\Files\подпапки копировать на другой ПК в C:\Distr\Files\подпапки
Копирование должно пройти быстро, в течении хотя бы 12 часов (этого будет достаточно). Но если возникнет необходимость повторного копирования, то копировать необходимо будет сделать только новые подпапки или файлы. Результат копирования, по возможности, лучше записать в лог, но без перечисления (т.к. боюсь это займет много времени и лог очень сильно вырастит), а как бы в процентном соотношении, что было скопировано всё в первом случае, и только новые файлы, во втором.

Отправлено: 10:54, 12-10-2020

 

Ветеран


Contributor


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

Профиль | Отправить 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.
		)
	)
pause
Exit /B
Цитата 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%\"
pause
Exit /B
Я бы предложил альтернативу: в лог писать только начало запуска и итог работы батника
Код: Выделить весь код
@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%\"
	)
pause
Exit /B
И, наконец, до меня только дошло, что возможно Вы бездумно вставили мой код в планировщик и поэтому Вы обнаружили
Цитата finderhd:
что если запускать батник через планировщик задач, а именно так и нужно будет (во внерабочее время) то в History не видно, что он отработал (нет записи Task Completed, только Action Started), как будто он до сих пор висит в памяти. »
Если в коде присутствует Pause (а я её оставлял, чтобы посмотреть на результат исполнения в командном окне), то батник в планировщике естественно никогда не завершится, Pause требует ответа. Убейте её, или напишите
Rem Pause

Надеюсь, Ваша реакция последует несколько раньше, чем Новый Год

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

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

Отправлено: 13:53, 11-11-2020 | #11



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

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


Ветеран


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

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


Цитата megaloman:
Надеюсь, Ваша реакция последует несколько раньше, чем Новый Год »
«Через две, через две зимы-ыы, через две, через две весны-ыы…» .
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:51, 11-11-2020 | #12


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


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

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


Цитата megaloman:
Я бы предложил альтернативу: в лог писать только начало запуска и итог работы батника »
Доброго дня. Уж извините, что так поздно отвечаю. Задача не срочная, а в перспективе, просто я готовлюсь заранее так сказать Ваше замечание учёл, буду стараться проверить сразу, к сожалению не всегда такая возможность есть, в виду других дел. По поводу паузы и планировщика, да, моё упущение.

Согласен с Вами, альтернатива замечательная, спасибо, проверю этот вариант в самое ближайшее время и отпишусь о результатах.

Отправлено: 11:36, 13-11-2020 | #13


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


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

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


Попробовал альтернативный способ - ничего не произошло. Если батник запускать из консоли, то ничего не происходит, но лог создается
В логе следующие записи:

File not found - *.*
0 File(s) copied

И еще вопрос - можно ли сделать так, чтобы атрибуты по дате создания каталогов, как в случае файлов (с файлами в этом плане всё нормально), сохранялись, а не отображались датой запуска батника?

Отправлено: 12:04, 13-11-2020 | #14


Ветеран


Contributor


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

Профиль | Отправить 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-файла
Цитата:
==================================== 13.11.2020 15:19:50,71 "Start Z:\я20111113.bat"
Скопировано файлов: 451.
==================================== 13.11.2020 15:20:02,71 "Start Z:\я20111113.bat"
Скопировано файлов: 0.
==================================== 13.11.2020 15:31:50,66 "Start Z:\я20111113.bat"
--- InBox not found "\\192.168.100.23\Test1\ttt" --- OutBox= "Z:\Box_Arc\Test1"
Не найден файл: *.*
Скопировано файлов: 0.
При первом запуске батника в выходной папке ничего не было, скопировалась куча файлов
При втором запуске ничего не скопировалось, так как всё уже было скопировано.
В третем случае я нарочно указал неверную папку - получил сообщение как у Вас
File not found - *.*
0 File(s) copied
Так что неча на зеркало пенять
Цитата finderhd:
можно ли сделать так, чтобы атрибуты по дате создания каталогов, как в случае файлов (с файлами в этом плане всё нормально), сохранялись, а не отображались датой запуска батника »
Стандартных методов не знаю. И с файлами тоже не так всё просто. При копировании файла его копия имеет дату создания копии, а дата изменения - реальная. То есть дата создания файла больше даты последнего изменения. С папками (возможно я ошибаюсь), при копировании дата создания и дата изменения будут иметь дату создания копии, а далее дата изменения - дата записи последнего файла в эту папку.

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


Последний раз редактировалось megaloman, 13-11-2020 в 18:07.

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

Отправлено: 15:26, 13-11-2020 | #15


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


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

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


Цитата megaloman:
У Вас неверно указан исходный путь. Переименуйте Ваш батник в файл с расширением »
У меня стоял символ \ в конце каталога, видимо из-за него.

Цитата megaloman:
Стандартных методов не знаю. И с файлами тоже не так всё просто. »
В принципе, это не критично, главное наличие самого файла.

В любом случае, теперь всё работает, спасибо!

Отправлено: 10:42, 16-11-2020 | #16


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


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

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


Заметил еще один момент. В папку назначения копируются только вложенные папки, а исходная, которая указывается в батнике (Test1) не копируется, если её не указать в назначении, это не совсем удобно, если нужно выборочное копирование.

Т.е. можно к примеру сделать так, чтобы в папке назначения не указывать имя копируемого каталога?

Set "BoxIn=\\192.168.100.23\Test1"
Set "BoxOut=Z:\Box_Arc\Test1"

Отправлено: 13:21, 16-11-2020 | #17


Ветеран


Contributor


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

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


Цитата finderhd:
а исходная, которая указывается в батнике (Test1) не копируется, если её не указать в назначении »
Копируется. Только содержимое \\192.168.100.23\Test1 попадёт в Z:\Box_Arc, просто папка Test1 не создастся. Для выборочного (и для полного тоже) копирования вот варианты:
Код: Выделить весь код
@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
Папка при отсутствии будет создана.

Можно сделать так:
Код: Выделить весь код
	Set "FromServer=E:" 
	Set "FromFolder=Тестовые_сетевые_папки\Test1\Дискета_от_книги\Chapter05"
Получим Z:\Box_Arc\Тестовые_сетевые_папки\Test1\Дискета_от_книги\Chapter05

Можно эдак:
Код: Выделить весь код
	Set "FromServer=E:\Тестовые_сетевые_папки" 
	Set "FromFolder=Test1\Дискета_от_книги\Chapter05"
Получим Z:\Box_Arc\Test1\Дискета_от_книги\Chapter05

А можно вообще извратиться, например, для копирования с разных серверов в одну папку с идентификацией сервера в копии
Код: Выделить весь код
	Set "FromServer=\" 
	Set "FromFolder=192.168.100.23\Test1\Дискета_от_книги\Chapter05"
Получим Z:\Box_Arc\192.168.100.23\Test1\Дискета_от_книги\Chapter05

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


Последний раз редактировалось megaloman, 26-11-2020 в 16:27.


Отправлено: 15:11, 16-11-2020 | #18


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


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

Профиль | Отправить 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


Ветеран


Contributor


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

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


finderhd, Для xcopy
Цитата:
/D:m-d-y Копирование файлов, измененных не ранее указанной даты.
Если дата не указана, заменяются только конечные файлы,
более старые, чем исходные.
Нелёгкая задача в CMD посчитать дату, вот вариант (тупо использую отлаженную процедуру):
Код: Выделить весь код
@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
Set /A DeltaDay=-31
Здесь указываем число дней для пересчета текущей даты ("-" назад).
Наверное можно то же сделать посредством forfiles.

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


Последний раз редактировалось megaloman, 26-11-2020 в 16:33.


Отправлено: 15:26, 26-11-2020 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Проблема с просмотром большого количества файлов в 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




 
Переход