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

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

Ответить
Настройки темы
CMD/BAT - Копирование только измененных файлов + контрольная сумма

Пользователь


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

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


Доброго всем времени суток. Помогите с написанием скрипта, так как нужные (для задачи) команды на просторах интернета не нашел.
Задача такова:
Есть папка "SHARE" и папка "SHARE-ARC".
Папка "SAHRE" - постоянно каждый день наполняется данными, изменяется. Соответственно папка "SHARE-ARC" - это ее копия, и сервер каждый вечер должен брать все измененные файлы из "SAHRE" и копировать в "SHARE-ARC".
Загвоздка вот в чем. Если в папке "SAHRE" какой-то файл изменился, но имя осталось прежним - он должен копироваться в папку "SHARE-ARC" рядом со своим первым файлом под именем .....(1). А файлы, которые один в один соответствуют - не копировать, дабы не занимать на это время и ресурсы. Файлы которые в структуре появились новые - копировать. Такое инкрементное копирование получается, но с дополнительным содержанием измененных файлов.
xcopy полагаю тут не очень поможет...

Отправлено: 18:06, 12-07-2023

 

Пользователь


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

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


Полагаю вот такой вариант решает проблему частично. Пропускает файлы, если они не изменены, и заменяет, если были изменены.
А нужно создавать рядом, если были изменены. Такого что-то не найду в синтаксисе...

Код: Выделить весь код
robocopy "E:\SHARE" "F:\SHARE-ARC" /E /R:3 /W:5 /V /NP /Z /ZB /LOG:C:\Users\adm777\Desktop\robocopy.log /XD "_АРХИВ ЗАКАЗОВ" "_ХРАНИЛИЩЕ ФАЙЛОВ" "333"

Отправлено: 19:12, 12-07-2023 | #2



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

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


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off &Cls
	Set "DirIn=Z:\SAHRE"
	Set "DirOut=Z:\SHARE-ARC"

	For /F "usebackq delims=" %%f In (`2^>nul xcopy /D /Y /L "%DirIn%\*.*" "%DirOut%\"`) Do (
		If Exist "%%f" (
			If Not Exist "%DirOut%\%%~nxf" (
				>nul copy "%DirIn%\%%~nxf" "%DirOut%\"
			) Else (
				Call :CopyNum "%%f"
			)
		)
	)
Exit /B 0

:CopyNum
	Set /A i=1
	:Begin
		Set "Add=(%i%)"
		If Not Exist "%DirOut%\%~n1%Add%%~x1" (>nul Copy %1 "%DirOut%\%~n1%Add%%~x1" &Exit /B)
		Set /A i+=1 
	GoTo :Begin 
Exit /B

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


Отправлено: 23:13, 12-07-2023 | #3


Пользователь


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

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


Проверил. Батник не отрабатывает. Может где-то ошибка((( окно быстро пропадает, пробовал и от админа и просто

Отправлено: 17:30, 13-07-2023 | #4


Ветеран


Contributor


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

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


Цитата Skylear:
Батник не отрабатывает. Может где-то ошибка((( окно быстро пропадает »
Скорее всего, у Вас неверно указан путь. Но загвоздка еще в другом:
Цитата Skylear:
он должен копироваться в папку "SHARE-ARC" рядом со своим первым файлом под именем .....(1). А файлы, которые один в один соответствуют - не копировать »
При такой постановке придётся для каждого файла искать его последний номер и сравнивать время каждого файла с имеющимся в архиве. Поэтому нужен другой подход: самый свежий файл должен быть без номера, самый старый - c номером (1)
Код: Выделить весь код
@Echo Off &rem Cls
	Set "DirIn=\\192.168.100.23\Test1"
	Set "DirOut=\\192.168.100.23\Test2"

	If Not Exist "%DirIn%\" (Echo !!! Folder "%DirIn%" not found &Pause &Exit /B 2) 
	If Not Exist "%DirOut%\" (Echo !!! Folder "%DirOut%" not found &Pause &Exit /B 2) 

	For /F "usebackq delims=" %%f In (`2^>nul xcopy /D /Y /L "%DirIn%\*.*" "%DirOut%\"`) Do (
		Echo %%f
		If Exist "%%f" (
			If Not Exist "%DirOut%\%%~nxf" (>nul copy "%DirIn%\%%~nxf" "%DirOut%\"
			) Else (Call :CopyNum "%%f")
		)
	)
Exit /B 0

:CopyNum
	Set /A i=1
	:Begin
		Set "Add=(%i%)"
		If Not Exist "%DirOut%\%~n1%Add%%~x1" (
			>nul Ren "%DirOut%\%~nx1" "%~n1%Add%%~x1"
			>nul copy "%DirIn%\%~nx1" "%DirOut%\"
			Exit /B
		)
		Set /A i+=1 
	GoTo :Begin 
Exit /B

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


Отправлено: 19:19, 13-07-2023 | #5


Пользователь


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

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


хм.... вообще не отрабатывает((
Пути локальные, а не сетевые.

и как старый будет добавляться под номером? все время переименовываться??? не совсем понимаю.
Схема такая:

Люди работают в шаре, например, один человек сегодня сделал файл-документ, а завтра его изменил и пересохранил. Так вот зеркальная шара для этого и нужна - чтобы иметь и сегодняшний документ и вчерашний. Так как они могут отличаться.
И сервер отрабатывает скрипт - и собирает измененные файлы с первой шары во вторую, но получается должен при совпадении имени, но разной дате создания - сохранять его рядом, а старый файл со вчера уже лежит и его незачем переименовывать

Отправлено: 19:33, 13-07-2023 | #6


Ветеран


Contributor


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

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


Цитата Skylear:
хм.... вообще не отрабатывает(( »
Переименуйте Ваш батник в txt и прикрепите к сообщению.
Отрабатывает, и неважно, какой путь, лишь бы реальный. Что-то Вы извратили
Берите новую версию батника, там контроль наличия путей

Цитата Skylear:
как старый будет добавляться под номером? »
Пусть в архиве есть
file.txt
Пользователь у себя его изменил
При копировании в архив старый файл станет с номером (1) а новый сохранит имя, итого получим:
file.txt
file(1).txt
Пользователь снова изменил файл. При копировании в архив старый файл станет с номером (2) а новый сохранит имя, итого получим:
file.txt
file(1).txt
file(2).txt
Максимальный номер соответствует предпоследней версии файла
Иначе как сравнивать по датам файл у пользователя и файл в архиве, если имена будут разные. Можно сделать, но это многократно медленнее. Стандартные команды, например, xcopy, сравнивают только одноименные файлы

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


Последний раз редактировалось megaloman, 13-07-2023 в 20:00.


Отправлено: 19:53, 13-07-2023 | #7


Пользователь


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

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


Вложения
Тип файла: txt xcopy_increment.txt
(734 байт, 4 просмотров)

да, алгоритм записан верно.
батник делаю из txt, кодировка 866, акельпадом редактирую, тестировал на разных путях (в том числе с русскими символами). В батник просто нужно записать пропуск определенных папок еще, я изначально делал на robocopy (там есть пропуск папок).

скрипт на robocopy такой (тоже 866):

Код: Выделить весь код
robocopy "E:\SHARE" "F:\SHARE-ARC" /E /R:3 /W:5 /V /NP /Z /ZB /LOG:C:\Users\Сисадмин\Desktop\robocopy.log /XD "_АРХИВ ЗАКАЗОВ" "_ХРАНИЛИЩЕ ФАЙЛОВ" "333"
файлик также прикладываю

Отправлено: 21:47, 19-07-2023 | #8


Пользователь


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

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


Ребята, нет ни у кого идей?

Отправлено: 22:14, 31-07-2023 | #9


Ветеран


Contributor


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

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


Вложения
Тип файла: zip яя.bat.zip
(549 байт, 1 просмотров)

Skylear, Обратите внимание на положение кавычек в моём коде и в Вашем
Код: Выделить весь код
	Set "DirIn="E:\SHARE"
Прикрепляю батник в нужной кодировке. Вы не указывали в постановке, что в исходной папке содержатся не только файлы, но и подпапки, да еще некоторые надо пропускать. Это уже несколько иная задача. Предложенный код на это не расчитан.

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


Отправлено: 07:03, 01-08-2023 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] При копировании файла изменяется контрольная сумма Bingo111 Непонятные проблемы с Железом 5 14-09-2021 16:34
VBS/WSH/JS - Копирование только новых файлов Serg2010 Скриптовые языки администрирования Windows 0 02-12-2017 22:51
CMD/BAT - [решено] Копирование измененных фалов+логи dahiko Скриптовые языки администрирования Windows 9 23-02-2016 16:45
Вопрос - теневое копирование измененных данных+защита от удаления. 9112 Защита компьютерных систем 3 20-10-2010 19:38
HDD - Неверная контрольная сумма ATA vzh11 Накопители (SSD, HDD, USB Flash) 4 27-03-2009 17:28




 
Переход