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

Аватара пользователя
finderhd

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

Сообщение finderhd »

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:



И лучше наверное все-таки убрать возможность записи в лог.
CMD/BAT - [решено] Копирование большого количества файлов по сети




Тогда это вообще одна строка

Код:

Код: Выделить всё

@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), как будто он до сих пор висит в памяти.
CMD/BAT - [решено] Копирование большого количества файлов по сети




Если в коде присутствует Pause (а я её оставлял, чтобы посмотреть на результат исполнения в командном окне), то батник в планировщике естественно никогда не завершится, Pause требует ответа. Убейте её, или напишите

Rem Pause

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

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

Сообщение Iska »

Цитата megaloman:



Надеюсь, Ваша реакция последует несколько раньше, чем Новый Год
CMD/BAT - [решено] Копирование большого количества файлов по сети




«Через две, через две зимы-ыы, через две, через две весны-ыы…» Изображение.
Аватара пользователя
finderhd

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

Сообщение finderhd »

Цитата megaloman:



Я бы предложил альтернативу: в лог писать только начало запуска и итог работы батника
CMD/BAT - [решено] Копирование большого количества файлов по сети




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



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

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

Сообщение finderhd »

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

В логе следующие записи:



File not found - *.*

0 File(s) copied



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

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

Сообщение megaloman »

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-файла

[spoiler]Цитата:[/spoiler]



==================================== 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:



можно ли сделать так, чтобы атрибуты по дате создания каталогов, как в случае файлов (с файлами в этом плане всё нормально), сохранялись, а не отображались датой запуска батника
CMD/BAT - [решено] Копирование большого количества файлов по сети




Стандартных методов не знаю. И с файлами тоже не так всё просто. При копировании файла его копия имеет дату создания копии, а дата изменения - реальная. То есть дата создания файла больше даты последнего изменения. С папками (возможно я ошибаюсь), при копировании дата создания и дата изменения будут иметь дату создания копии, а далее дата изменения - дата записи последнего файла в эту папку.
Аватара пользователя
finderhd

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

Сообщение finderhd »

Цитата megaloman:



У Вас неверно указан исходный путь. Переименуйте Ваш батник в файл с расширением
CMD/BAT - [решено] Копирование большого количества файлов по сети




У меня стоял символ \ в конце каталога, видимо из-за него.




Цитата megaloman:



Стандартных методов не знаю. И с файлами тоже не так всё просто.
CMD/BAT - [решено] Копирование большого количества файлов по сети




В принципе, это не критично, главное наличие самого файла.



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

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

Сообщение finderhd »

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



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



Set "BoxIn=\\192.168.100.23\Test1"

Set "BoxOut=Z:\Box_Arc\Test1"
Аватара пользователя
megaloman

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

Сообщение megaloman »

Цитата finderhd:



а исходная, которая указывается в батнике (Test1) не копируется, если её не указать в назначении
CMD/BAT - [решено] Копирование большого количества файлов по сети




Копируется. Только содержимое \\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
Аватара пользователя
finderhd

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

Сообщение finderhd »

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



Все отлично скопировалось. Но к задаче добавилось условие для некоторых других папок. Т.е. их как то выделять или добавлять отдельно в бат файл не нужно, я просто их сам укажу. Как с них по такому же сценарию скопировать файлы, но в зависимости от даты создания? Например, чтобы скопировались только файлы, созданные за последний месяц, год и т.д. в количестве дней, подскажите пожалуйста.
Аватара пользователя
megaloman

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

Сообщение megaloman »

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 Заимствовано viewtopic.php?t=13743
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.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»