Показать полную графическую версию : Копирование только измененных файлов + контрольная сумма
Доброго всем времени суток. Помогите с написанием скрипта, так как нужные (для задачи) команды на просторах интернета не нашел.
Задача такова:
Есть папка "SHARE" и папка "SHARE-ARC".
Папка "SAHRE" - постоянно каждый день наполняется данными, изменяется. Соответственно папка "SHARE-ARC" - это ее копия, и сервер каждый вечер должен брать все измененные файлы из "SAHRE" и копировать в "SHARE-ARC".
Загвоздка вот в чем. Если в папке "SAHRE" какой-то файл изменился, но имя осталось прежним - он должен копироваться в папку "SHARE-ARC" рядом со своим первым файлом под именем .....(1). А файлы, которые один в один соответствуют - не копировать, дабы не занимать на это время и ресурсы. Файлы которые в структуре появились новые - копировать. Такое инкрементное копирование получается, но с дополнительным содержанием измененных файлов.
xcopy полагаю тут не очень поможет...
Полагаю вот такой вариант решает проблему частично. Пропускает файлы, если они не изменены, и заменяет, если были изменены.
А нужно создавать рядом, если были изменены. Такого что-то не найду в синтаксисе...
robocopy "E:\SHARE" "F:\SHARE-ARC" /E /R:3 /W:5 /V /NP /Z /ZB /LOG:C:\Users\adm777\Desktop\robocopy.log /XD "_АРХИВ ЗАКАЗОВ" "_ХРАНИЛИЩЕ ФАЙЛОВ" "333"
megaloman
12-07-2023, 23:13
@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
Проверил. Батник не отрабатывает. Может где-то ошибка((( окно быстро пропадает, пробовал и от админа и просто
megaloman
13-07-2023, 19:19
Батник не отрабатывает. Может где-то ошибка((( окно быстро пропадает »Скорее всего, у Вас неверно указан путь. Но загвоздка еще в другом:он должен копироваться в папку "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
хм.... вообще не отрабатывает((
Пути локальные, а не сетевые.
и как старый будет добавляться под номером? все время переименовываться??? не совсем понимаю.
Схема такая:
Люди работают в шаре, например, один человек сегодня сделал файл-документ, а завтра его изменил и пересохранил. Так вот зеркальная шара для этого и нужна - чтобы иметь и сегодняшний документ и вчерашний. Так как они могут отличаться.
И сервер отрабатывает скрипт - и собирает измененные файлы с первой шары во вторую, но получается должен при совпадении имени, но разной дате создания - сохранять его рядом, а старый файл со вчера уже лежит и его незачем переименовывать
megaloman
13-07-2023, 19:53
хм.... вообще не отрабатывает(( »Переименуйте Ваш батник в txt и прикрепите к сообщению.
Отрабатывает, и неважно, какой путь, лишь бы реальный. Что-то Вы извратили
Берите новую версию батника, там контроль наличия путей
как старый будет добавляться под номером? » Пусть в архиве есть
file.txt
Пользователь у себя его изменил
При копировании в архив старый файл станет с номером (1) а новый сохранит имя, итого получим:
file.txt
file(1).txt
Пользователь снова изменил файл. При копировании в архив старый файл станет с номером (2) а новый сохранит имя, итого получим:
file.txt
file(1).txt
file(2).txt
Максимальный номер соответствует предпоследней версии файла
Иначе как сравнивать по датам файл у пользователя и файл в архиве, если имена будут разные. Можно сделать, но это многократно медленнее. Стандартные команды, например, xcopy, сравнивают только одноименные файлы
да, алгоритм записан верно.
батник делаю из 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"
файлик также прикладываю
Ребята, нет ни у кого идей?
megaloman
01-08-2023, 07:03
Skylear, Обратите внимание на положение кавычек в моём коде и в Вашем Set "DirIn="E:\SHARE"Прикрепляю батник в нужной кодировке. Вы не указывали в постановке, что в исходной папке содержатся не только файлы, но и подпапки, да еще некоторые надо пропускать. Это уже несколько иная задача. Предложенный код на это не расчитан.
megaloman
01-08-2023, 08:44
Вариант с подпапками и исключениями@Echo Off &Cls
Set "DirIn=Z:\У попа была собака"
Set "DirOut=Z:\Поп ее любил"
Set Exclude="\Она съела\Кусок мяса\" "\Он её убил\"
If Not Exist "%DirIn%\" (Echo !!! Folder "%DirIn%" not found &Pause &Exit /B 2)
Pushd "%DirOut%" ||(Echo !!! Folder "%DirOut%" not found &Pause &Exit /B 2)
>"~~~Exclude" (For %%d In (%Exclude%) Do Echo %%~d)
For /F "usebackq delims=" %%f In (`2^>nul xcopy /EXCLUDE:~~~Exclude /D /S /Y /L /F "%DirIn%\*.*" "%DirOut%\" ^| Find "\"`) Do (
Set "Out=%%f"
(Call Set Out=%%Out: -^> =?%%)
For /F "usebackq tokens=1,2 delims=?" %%i In (`Call Echo %%Out%%`) Do (
Echo "%%i" "%%j"
If Not Exist "%%j" (>nul Xcopy /Y /F "%%i" "%%~dpj"
) Else (Call :CopyNum "%%i" "%%j")
)
)
Del ~~~Exclude
Popd
Pause
Exit /B 0
:CopyNum
Set /A i=1
:Begin
Set "Add=(%i%)"
If Not Exist "%~dpn2%Add%%~x2" (
>nul Ren %2 "%~n1%Add%%~x1"
>nul copy %1 "%~dp2"
Exit /B
)
Set /A i+=1
GoTo :Begin
Exit /B
Проверил. Вроде отрабатывает. Единственное - это не копирует пустые каталоги. И еще можно сделать, чтобы выводил в cmd что делает? Паузу я так понимаю, можно просто закомментировать.
megaloman
01-08-2023, 15:22
не копирует пустые каталоги. И еще можно сделать, чтобы выводил в cmd что делает? »@Echo Off &Cls
Set "DirIn=Z:\У попа была собака"
Set "DirOut=Z:\Поп ее любил"
Set Exclude="\Она съела\Кусок мяса\" "\Он её убил\"
Set "Log=%DirOut%\~~~%~nx0.log"
If Not Exist "%DirIn%\" (Echo !!! Folder "%DirIn%" not found &Pause &Exit /B 2)
Pushd "%DirOut%" ||(Echo !!! Folder "%DirOut%" not found &Pause &Exit /B 2)
>"~~~Exclude" (For %%d In (%Exclude%) Do Echo %%~d)
xcopy /EXCLUDE:~~~Exclude /T /E /Y "%DirIn%\*.*" "%DirOut%\"
>>"%Log%" Echo +++ %Date% %Time%
For /F "usebackq delims=" %%f In (`2^>nul xcopy /EXCLUDE:~~~Exclude /D /S /Y /L /F "%DirIn%\*.*" "%DirOut%\" ^| Find "\"`) Do (
Set "Out=%%f"
(Call Set Out=%%Out: -^> =?%%)
For /F "usebackq tokens=1,2 delims=?" %%i In (`Call Echo %%Out%%`) Do (
Echo "%%i" "%%j"
If Not Exist "%%j" (
>nul Xcopy /Y /F "%%i" "%%~dpj" &>>"%Log%" Echo "%%i" -^> "%%~dpj"
) Else (Call :CopyNum "%%i" "%%j")
)
)
Del ~~~Exclude
Popd
Pause
Exit /B 0
:CopyNum
Set /A i=1
:Begin
Set "Add=(%i%)"
If Not Exist "%~dpn2%Add%%~x2" (
>nul Ren %2 "%~n1%Add%%~x1" &>>"%Log%" Echo === %2 -^> "%~n1%Add%%~x1"
>nul copy %1 %2 &>>"%Log%" Echo %1 -^> %2
Exit /B
)
Set /A i+=1
GoTo :Begin
Exit /B
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC