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

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

Ответить
Настройки темы
Любой язык - [решено] Скрипт для копирования файлов/папок с заменой

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


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

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


Всем здрасьте )) , в общем поставили передо мной такую задачу, имеется папка с бекапами, нужно что бы эта папка копировалась в определенное место, раз в сутки, а по истечении 7 дней, заменялись на новые по одному (по принципу как в видео регистраторе)
Подскажите как это реализовать, идея есть через xcopy, но она может копировать файлы по изменению в определенный день, либо после, а надо что бы более старые затирались.

Отправлено: 16:35, 20-03-2013

 

Ветеран


Contributor


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

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


Постановка задачи в Вашем изложении весьма запутана, поэтому сам себе ставлю задачу и сам её решаю
Имеется папка, например, E:\Delete, в которой создаются подпапки с именами вида дд.мм.гггг .
В них создаются файлы с именами вида ггггммддччмм.rar
Также есть папка, например, E:\DDDDD, в которой хранятся копии файлов из указанных папок, но копии файлов в этой папке должны храниться не более недели.
Вот батник, который удаляет в папке E:\DDDDD копии файлов старше недели (время создания файла анализируется по информации в его имени ггггммдд) и копирует все файлы в подпапках E:\Delete\дд.мм.гггг\ггггммддччмм.rar в папку E:\DDDDD, которые не старше недели и которых еще нет в папке E:\DDDDD (время создания файлов определяется из имени папки дд.мм.гггг)
Код: Выделить весь код
@Echo Off

Set From=E:\Delete
Set To=E:\DDDDD
Set Mask=20*.rar
Set MaskD=??.??.20??

Set DeltaDay=-7

SetLocal EnableExtensions EnableDelayedExpansion

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

Call :FromNow %DeltaDay% %Date%

rem Чистим папку %To% от файлов старше недели

If Exist "%To%\%Mask%" (
	FOR /F "usebackq delims=" %%j IN (`Dir "%To%\%Mask%" /B /A:-D /O:N`) DO (
		Set FDate=%%~nxj
		Set FDate=!FDate:~0,8!
		If !FDate! LEQ %yyyymmdd% (Del "%To%\%%j">NUL) Else (GoTo :Continue) 
	)
)
:Continue

rem Копируем файлы из папок во %From% не старше недели

FOR /F "usebackq delims=" %%j IN (`Dir "%From%\%MaskD%" /B /A:D /O:N`) DO (
	Set FDate=%%~nxj
	Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
	If !FDate! GTR %yyyymmdd% XCopy "%From%\%%j\%Mask%" "%To%\" /D /Y >NUL
)

GoTo :Eof

:FromNow
 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 yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof
Пересчет даты заимствовал здесь

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

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

Отправлено: 18:13, 29-03-2013 | #11



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

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


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


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

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


Все верно так и должно работать, пути папок изменил на свои, имена папок в формате dd.mm.yyyy, имена архивов yyyymmddhhmm_1C.rar, но думаю это не принципиально если указана маска 20*.rar, но не копирует, просто выполняется батник, но ни чего не происходит.

Отправлено: 09:21, 04-04-2013 | #12


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


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

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


Вложения
Тип файла: rar move1.rar
(897 байт, 8 просмотров)

Вот что происходит
Код: Выделить весь код
C:\Documents and Settings\Администратор>D:\move\move1.cmd

C:\Documents and Settings\Администратор>chcp 866
Текущая кодовая страница: 866

C:\Documents and Settings\Администратор>chcp 1251
Текущая кодовая страница: 1251

C:\Documents and Settings\Администратор>Set From=D:\bcp

C:\Documents and Settings\Администратор>Set To=D:\target_bkp

C:\Documents and Settings\Администратор>Set Mask=20*.rar

C:\Documents and Settings\Администратор>Set MaskD=??.??.20??

C:\Documents and Settings\Администратор>Set DeltaDay=-7

C:\Documents and Settings\Администратор>SetLocal EnableExtensions EnableDelayedE
xpansion

C:\Documents and Settings\Администратор>rem Пересчет даты на заданное кол-во дне
й

C:\Documents and Settings\Администратор>rem Формат даты dd.mm.yyyy +- дни получи
м новые yyyymmdd

C:\Documents and Settings\Администратор>Call :FromNow -7 04.04.2013

C:\Documents and Settings\Администратор>SetLocal

C:\Documents and Settings\Администратор>Set DT=04.04.2013

C:\Documents and Settings\Администратор>Set yyyy=2013  & set /a mm=10004%100  &
set /a dd=10004%100

C:\Documents and Settings\Администратор>Set /A JD=-7+dd-32075+1461*(yyyy+4800+(m
m-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4

C:\Documents and Settings\Администратор>Set /A L=JD+68569,N=4*L/146097,L=L-(1460
97*N+3)/4,I=4000*(L+1)/1461001

C:\Documents and Settings\Администратор>Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2
447*J/80,L=J/11

C:\Documents and Settings\Администратор>Set /A J=J+2-12*L,I=100*(N-49)+I+L

C:\Documents and Settings\Администратор>Set /A yyyy=I,mm=100+J,dd=100+K

C:\Documents and Settings\Администратор>EndLocal & Set yyyymmdd=20130328

C:\Documents and Settings\Администратор>GoTo :Eof

C:\Documents and Settings\Администратор>rem Чистим папку D:\target_bkp от файлов
 старше недели

C:\Documents and Settings\Администратор>If Exist "D:\target_bkp\20*.rar" (FOR /F
 "usebackq delims=" %j IN (`Dir "D:\target_bkp\20*.rar" /B /A:-D /O:N`) DO (
Echo "D:\bcp\??.??.20??" %j
 pause
 Set FDate=%~nxj
 Set FDate=!FDate:~0,8!
 If !FDate! LEQ 20130328 (Del "D:\target_bkp\%j" 1>NUL )  Else (GoTo :Continue )

) )

C:\Documents and Settings\Администратор>rem Копируем файлы из папок во D:\bcp не
 старше недели

C:\Documents and Settings\Администратор>FOR /F "usebackq delims=" %j IN (`Dir "D
:\bcp\??.??.20??" /B /A:D /O:N`) DO (
Set FDate=%~nxj
 Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
 If !FDate! GTR 20130328 XCopy "D:\bcp\%j\20*.rar" "D:\target_bkp\" /D /Y  1>NUL

)

C:\Documents and Settings\Администратор>(
Set FDate=06.03.2013
 Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
 If !FDate! GTR 20130328 XCopy "D:\bcp\06.03.2013\20*.rar" "D:\target_bkp\" /D /
Y  1>NUL
)

C:\Documents and Settings\Администратор>(
Set FDate=23.03.2013
 Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
 If !FDate! GTR 20130328 XCopy "D:\bcp\23.03.2013\20*.rar" "D:\target_bkp\" /D /
Y  1>NUL
)

C:\Documents and Settings\Администратор>(
Set FDate=24.03.2013
 Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
 If !FDate! GTR 20130328 XCopy "D:\bcp\24.03.2013\20*.rar" "D:\target_bkp\" /D /
Y  1>NUL
)

C:\Documents and Settings\Администратор>(
Set FDate=25.03.2013
 Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
 If !FDate! GTR 20130328 XCopy "D:\bcp\25.03.2013\20*.rar" "D:\target_bkp\" /D /
Y  1>NUL
)

C:\Documents and Settings\Администратор>GoTo :Eof

Последний раз редактировалось darkAge, 04-04-2013 в 12:08.

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

Отправлено: 11:52, 04-04-2013 | #13


Ветеран


Contributor


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

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


Судя по приведенному, Вам нЕчего копировать. По этой картинке будем копировать файлы из папок, начиная с 29.03.2013 и т д., а последнее, что у Вас есть, 25.03.2013 - вне диапазона на сохранение. Вы не предоставили данные для батника. Кстати, батник набран не в 866 кодировке, но, так как у Вас не присутствуют в описании путей русские буквы - это не принципиально.

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

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

Отправлено: 13:06, 04-04-2013 | #14


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


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

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


Во точно, ступил, поставил 29 дней, начал копировать.
спасибо.

Отправлено: 17:23, 04-04-2013 | #15


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


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

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


Изображения
Тип файла: jpg Снимок.JPG
(66.9 Kb, 10 просмотров)

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

Отправлено: 14:17, 28-06-2013 | #16


Ветеран


Contributor


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

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


Безотносительно к написанным мной скриптам (сейчас некогда вспоминать и разбираться) вызываем хелп для команды Del и читаем
Цитата:
del /?
Удаление одного или нескольких файлов.

DEL [/P] [/F] [/S] [/q] [/A[[:]атрибуты]] имена
ERASE [/P] [/F] [/S] [/q] [/A[[:]атрибуты]] имена

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

/P Запрос подтверждения перед удалением каждого файла.
/F Принудительное удаление файлов, доступных только для чтения.
/S Удаление указанных файлов из всех подкаталогов.
/Q Отключение запроса на подтверждение при удалении файлов.
/A Отбор файлов для удаления по атрибутам.
атрибуты R Файлы, доступные только для чтения.
S Системные файлы.
H Скрытые файлы.
A Файлы, готовые для архивирования.
I Файлы с неиндексированным содержимым.
L Точки повторной обработки.
- Префикс "-" имеет значение НЕ.

Изменение команд DEL и ERASE при включении расширенной обработки команд:

Результаты вывода для ключа /S принимают обратный характер, то есть выводятся
только имена удаленных файлов, а не файлов, которые не удалось найти.

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


Отправлено: 18:58, 28-06-2013 | #17


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


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

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


добавил атрибуты, не помогло все равно запрос выдается

Код: Выделить весь код
@Echo on

chcp 866


Set From=E:\BackUp\virtual
Set To=\\192.168.3.13\Backup\Virtual
Set Mask=20*.rar
Set MaskD=??.??.20??

Set DeltaDay=-7

SetLocal EnableExtensions EnableDelayedExpansion

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

Call :FromNow %DeltaDay% %Date%

rem Чистим папку %To% от файлов старше недели

If Exist "%To%\%Mask%" (
	FOR /F "usebackq delims=" %%j IN (`Dir "%To%\%Mask%" /B /A:-D /O:N`) DO (

Echo "%From%\%MaskD%" %%j
pause
		Set FDate=%%~nxj
		Set FDate=!FDate:~0,8!
		If !FDate! LEQ %yyyymmdd% (Del "%To%\%%j" /Q /F >NUL) Else (GoTo :Continue) 
	)
)
:Continue


rem Копируем файлы из папок во %From% не старше недели

FOR /F "usebackq delims=" %%j IN (`Dir "%From%\%MaskD%" /B /A:D /O:N`) DO (
	Set FDate=%%~nxj
	Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
	If !FDate! GTR %yyyymmdd% XCopy "%From%\%%j\%Mask%" "%To%\" /D /Y >NUL
)

GoTo :Eof

:FromNow
 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 yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof

Последний раз редактировалось darkAge, 01-07-2013 в 13:29.


Отправлено: 13:17, 01-07-2013 | #18


Аватара для sunnykey

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


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

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


Цитата darkAge:
добавил атрибуты, не помогло все равно запрос выдается »
У тебя в скрипте команда pause. Она вызывает остановку скрипта.
Код: Выделить весь код
Call :FromNow %DeltaDay% %Date%

rem Чистим папку %To% от файлов старше недели

If Exist "%To%\%Mask%" (
	FOR /F "usebackq delims=" %%j IN (`Dir "%To%\%Mask%" /B /A:-D /O:N`) DO (

Echo "%From%\%MaskD%" %%j
pause
		Set FDate=%%~nxj
		Set FDate=!FDate:~0,8!
		If !FDate! LEQ %yyyymmdd% (Del "%To%\%%j" /Q /F >NUL) Else (GoTo :Continue) 
	)
)
На досуге не забывай читать справку ко всем неизвестным командам
Код: Выделить весь код
C:\>pause /?
Приостановка выполнения пакетного файла и вывод сообщения:
    Для продолжения нажмите любую клавишу . . .

-------
cmd умри, powershell живи=)
Powershel 4.0 microsoft.com/ru-ru/download/details.aspx?id=40855

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

Отправлено: 17:02, 01-07-2013 | #19


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


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

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


Всем спасибо, все заработало.

Отправлено: 18:06, 01-07-2013 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Скрипт для удаления старых файлов и папок из определенной папки avfiga Скриптовые языки администрирования Windows 71 07-01-2023 18:50
Система - Скрипт для закрытия окон/программ/файлов/папок/etc... средней кнопкой мыши. _duke_ Программное обеспечение Windows 15 22-06-2013 15:31
CMD/BAT - Скрипт копирования файлов и папок в сети в дерикторию пользователей DNKolian Скриптовые языки администрирования Windows 2 18-02-2013 10:52
CMD/BAT - Скрипт для копирования папок по сети _bb_ Скриптовые языки администрирования Windows 4 02-03-2011 15:07
Скрипт для копирования файлов с 1 сервера на несколько andro_id Программирование в *nix 2 04-09-2008 11:48




 
Переход