Показать полную графическую версию : [решено] Перемещение устаревших файлов из папки в резервную папку
zavoruev
02-04-2010, 10:11
всем добрый день! Имеется задача перемещения устаревший файлов из папки, но не всех, а только недельной давности, что бы файлы за последнюю неделю сохранялись. Скрипт будет выполняться 2 раза в неделю. На данный момент имею вот такой скрипт, но перемещения файлов не происходит???!! Подскажите по чему!
@Echo Off
:: Параметры скрипта, 0 < $OLD < 29!
:: $OLD - столько ДНЕЙ храним архивы
Set $SRC=D:\obmen1
Set $DST=D:\Backup_Obmen1
Set $OLD=1
:: Находим текущие день/месяц/год
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $Y=%$Time:~0,4%&Set $M=0%$Time:~4,2%&Set $D=0%$Time:~6,2%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
:: копируем старые каталоги (файлы)
Call :GetOldDate %$OLD%
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.????') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k %$DST%\"
:: Выход
EXIT
:GetOldDate
:: -----------------------------------
:: Расчет даты, предшествующей текущей
:: заданное количество дней (< 29)
:: -----------------------------------
Set /A $D -= %1
If %$D% GTR 0 GoTo GetOldDate_2
:: Месяц, год, дней в месяце
Set /A $M=%$M%+11-((%$M%+10)/12)*12
If %$M% EQU 12 Set /A $Y-=1
For /F "Tokens=%$M%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set $X=%%i
If %$M% NEQ 2 GoTo GetOldDate_1
:: Февраль високосного года
Set /A $B1=%$Y%-(%$Y%/4)*4
Set /A $B2=%$Y%-(%$Y%/100)*100
Set /A $B3=%$Y%-(%$Y%/400)*400
If 0 EQU %$B1% If 0 NEQ %$B2% Set /A $X+=1
If 0 EQU %$B3% Set /A $X+=1
:: День месяца
:GetOldDate_1
Set /A $D=%$D%+%$X%-((%$D%+%$X%-1)/%$X%)*%$X%
:: Форматирование даты
:GetOldDate_2
Set $M=0%$M%&Set $D=0%$D%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
GoTo :EOF
zavoruev
05-04-2010, 12:52
Товарищи)))) поготите пож-та, я знаю что ошибка у меня вот здесь
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.????') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k %$DST%\"
но т.к я не пишу скрипты не пишу, ошибку найти не могу. Жду совета или лучше всего ответа!!!
Неблагодарное занятие - копаццо в чужих скриптах (или в своих старых) - трудно разобраться.
Что сразу бросилось в глаза - в ищите только каталоги (dir /A:D), при этом команда Move может только переименовывать каталоги, но не переносить.
Что касается календаря - сам с такими вычислениями в пакетниках не разбирался, здесь мне проверять сложно.
zavoruev
05-04-2010, 14:24
(или в своих старых) - трудно разобраться »
вот это верно подмеченно, скрипт не мой, а Ваш! И мне бы хотелось что бы основная задача решалась, но не получается!
по этому прошу помочь в составлении нового, либо редактировании старого скрипта
На счет команды DIR, вот ключи с которыми она делается, это ни как не каталоги
/A Вывод файлов с указанными атрибутами.
атрибуты D Каталоги R Доступные только для чтения
H Скрытые файлы A Файлы для архивирования
S Системные файлы Префикс "-" имеет значение НЕ
/B Вывод только имен файлов.
И Команда Move
Перемещение одного или более файлов:
MOVE [/Y | /-Y] [диск:][путь]имя_файла1[,...] назначение
Переименование папки:
MOVE [/Y | /-Y] [диск:][путь]имя_папки новое_имя_папки
Тогда как же переместить папки?
1. Прям "Операция-Ы" - "извините, не НАШ, а ВАШ!" - этот скрипт точно не мой, я не люблю переменные записывать в таком формате, да и ремарки через двоеточие - моветон. (ну да это не вопрос, а так, шутки ради)
2. Если вывести DIR с ключем /A - на экране окажутся все файлы и каталоги, а с ключом /A:D - исключительно каталоги (попробуйте в командной строке). Далее, маска файлов/каталогов. До XP маска вида ??.??.???? работала однозначно, а сейчас выходит так, что последний знак вопроса является астериском
3. Папки перемещать очень сложно, появлется куча искажений там, где в файлах и папках встречаются спецсимволы типа пробела и прочих. Самый простой (но медленный ) способ - скопировать xcopy и затем удалить.
4. Вот аккуратный подсчет времени - проблема, которой я ниразу не баловался.
Если проблему можно описать другим способом, с более простыми условия, тогда можно попробовать...
zavoruev
05-04-2010, 15:51
с удовольствием))) Мне надо что бы в папке оставались файлы недельной давности, этот скрипт я взяд в качестве примера, т.к на рабоих файлах эксперементировать не стал! Хотел добиться одного, перемещение каталогов, а с файлами было бы легче.
Есть папка, в нее скапливаются выгрузки из 1С, формат файла таков DATA260.ARJ и если файл большой то он вот в таком формате DATA265.A01, DATA265.A02, DATA265.A03. эти выгрузки происходят раз в день а иногда и 2 раза. мне необходимо что бы в данной папке после отработки скрипта оставались только файлы недельной давности (их может быть 5, если формат такой DATA260.ARJ, или 15 если формат токой DATA265.A02). Ни каких спец. символов нет. Эти файлы перемещаются для бэкапа в другую папку, где раз в месяц делается бэкап winrar.
zavoruev
05-04-2010, 16:57
Сейчас попробывал сделать тестовый скрипт не для перемещения а для копирования созданных каталогов! результата нет! Вот код:
@Echo Off
:: Параметры скрипта, 0 < $OLD < 29!
:: $OLD - столько ДНЕЙ храним архивы
Set $SRC=D:\obmen1
Set $DST=D:\Backup_Obmen1
Set $OLD=1
:: Находим текущие день/месяц/год
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $Y=%$Time:~0,4%&Set $M=0%$Time:~4,2%&Set $D=0%$Time:~6,2%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
:: Создаем каталог
Mkdir %$SRC%\%$D%.%$M%.%$Y%\
:: копируем старые каталоги (файлы)
Call :GetOldDate %$OLD%
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.??') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% XCopy /S/E/D/C/Q "%$SRC%\%%i.%%j.%%k %$DST%\"
:: Выход
EXIT
:GetOldDate
:: -----------------------------------
:: Расчет даты, предшествующей текущей
:: заданное количество дней (< 29)
:: -----------------------------------
Set /A $D -= %1
If %$D% GTR 0 GoTo GetOldDate_2
:: Месяц, год, дней в месяце
Set /A $M=%$M%+11-((%$M%+10)/12)*12
If %$M% EQU 12 Set /A $Y-=1
For /F "Tokens=%$M%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set $X=%%i
If %$M% NEQ 2 GoTo GetOldDate_1
:: Февраль високосного года
Set /A $B1=%$Y%-(%$Y%/4)*4
Set /A $B2=%$Y%-(%$Y%/100)*100
Set /A $B3=%$Y%-(%$Y%/400)*400
If 0 EQU %$B1% If 0 NEQ %$B2% Set /A $X+=1
If 0 EQU %$B3% Set /A $X+=1
:: День месяца
:GetOldDate_1
Set /A $D=%$D%+%$X%-((%$D%+%$X%-1)/%$X%)*%$X%
:: Форматирование даты
:GetOldDate_2
Set $M=0%$M%&Set $D=0%$D%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
GoTo :EOF
Насколько понимаю - каталог бэкапа не содержит подкаталогов, т.е. достаточно переносить только файлы.
Предлагаю такой вариант решения задачи (если устроит - смогу быстренько накидать) - в папке, где запускается скрипт, остаются все файлы с 5 РАЗЛИЧНЫМИ НАИСВЕЖАЙШИМИ датами.
Возможные глюки: Если по какой-то причине в какой-то из дней не появилось новых файлов, то после скрипта останутся файлы не за последние 5 дней, а на 1 день больше.
Как такой вариант?
ЗЫ: Архивировать *.ARJ винраром - только прибавлять в весе...
Вот:
@echo off
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set Dst=C:\TEMP\
for /f "tokens=* delims=" %%F in ('dir /a-d /b /o-d') do if "!N!"=="5" (
move /Y %%F %Dst%
Echo Moving %%F ^(!D!^) Err=!ErrorLevel! >>Last5.log
) else (
set D=%%~tF
set D=!D:~0,10!
if not "!D!"=="!P!" (
set P=!D!
set /a N+=1
)
echo Skiping %%F ^(!D!, wait=!N!^)>>Last5.log
)
zavoruev
07-04-2010, 09:18
NiOl, , все хорошо, только я не пойму где в этом скрипте указана директории куда перемещать файлы.
Как я понимаю set Dst=C:\TEMP » это каталог откуда перемещаются файлы,
и что это за файл Last5.log », что в него записывается?
1. Запускать скрипт нужно из каталога, откуда файлы переносятся
2. Dst=C:\TEMP - это как раз папка, куда они переносятся. В сырце остался каталог, на котором я проводил проверку на своем компе.
3. Поскольку этот батник оставлял файлы за последние 5 разных дат, то рабочее название его было Last5.bat, и соответственно лог того, что делалось кидалось в файл Last5.log. Конечно, по-хорошему надо было написать так: %~dpn0.log или %~n0.log и имя лог-файла автоматом соответствовало бы имени скрипта, но я очень торопился и было лень сделать все красиво. Вообще, в лог нужно еще кидать дату/время, иначе это не лог...
zavoruev
07-04-2010, 12:21
Как я понимаю, скрипт должен лежать в той папке где и перемещаемые файлы???? если в другой папке то скрипт не выполнится???? По шедуллеру можно этот скрипт выполнять?
Скрипт лучше всего держать в отдельной папке, вместе с другими скриптами, можно где-нить в софте. При этом скрипт будет аналогичен любой другой программе/внешней команде - можно вызывать практически откуда угодно (при всех ограничениях скриптов их несомненный плюс - открытый исходный текст, не требующий спец.софта для внесения изменений).
А вот запускать этот скрипт надо именно в папке-источнике, например лежит в D:\SOFT\Scripts\, а запускается (например поле "start in" в ярлыке) в E:\DB\1C\BackUp\, при этом отличие лог-файлов %~dpn0.log от %~n0.log будет в том, что в певом случае лог-файл ведется там, где расположен сам скрипт (D:\SOFT\Scripts\), а во втором случае - там, из какой папки запущен (E:\DB\1C\BackUp\).
Подобные скрипты обычно по шедулеру и запускаются.
zavoruev
07-04-2010, 13:34
NiOl, ты все очень подробно расписал, спасибо! Я только не пойму, как можно в шедулере запустить скрипт который лежит в C:\scripts\ что бы он запускался в D:\Obmen1C\ !! Не могу это сделать, подскажите как? Очень нужно!)
Думаю, что Вы уже создали "задание" для шедула. Теперь редактируем его (правая кнопка мыши - свойства)
В первой вкладке все основное, что нам нать:
1. Run: (строка запуска) = C:\scripts\script.bat
2. Start in: (запускать в каталоге) = D:\Obmen1C\
3. Comments (примечания) - на свое усмотрение, вообще полезно подписывать, какое задание для чего, например "пятничная чиска бэкапов 1С"
4. Run as (запускать от имени) = учетная запись, имеющая право логиниться на этот сервер и вносить необходимые изменения (удалять файлы в папке "D:\Obmen1C\") и рядом кнопка для указания пароля этой учетки.
5. Enabled (разрешено) - если галочка стоит, то задание будет исполняться.
На второй вкладке указывается периодичность вызова задания. В списке явно нехватает пунктов "каждые nn часов" и "каждые nn минут" ;)
На третей вкладке дополнительные опции, определяющие некоторые условия выполнения задания, для большинства задач параметры по-умолчанию вполне подходят.
На четвертой - указаны права на само задание шедула, скажим та - на запуск задания и на редактирование задания.
«Рабочая папка:» в свойствах созданного задания.
zavoruev
07-04-2010, 14:09
Всем спасибо за ответы!
NiOl, А как бы доработать приведенный в топике скрипт, учитывая то что расчет даты правильный, и необходимо только переместить файлы старше 5 дней (переменная OLD) в другую папку. Как я понимаю тут не праильно работает во эта команда, может все таки попробуем его доработать)))!!! For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.????') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k %$DST%\" »
Буду очень признателен за оказанную помощь!
Всем спасибо за ответы!
NiOl, А как бы доработать приведенный в топике скрипт, учитывая то что расчет даты правильный, и необходимо только переместить файлы старше 5 дней (переменная OLD) в другую папку. Как я понимаю тут не праильно работает во эта команда, может все таки попробуем его доработать)))!!!
Цитата zavoruev:
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.????') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k %$DST%\" »
Буду очень признателен за оказанную помощь! »
Логгер: на форуме молчание 15 минут... :lol:
наскоро просмотрев исходный скрипт, уделив особое вниманеи указанное строке, у меня вышло 1 предупреждение и 4 ошибки:
1. Процедура GetOldDate выходит по команде GoTo :EOF и я не уверен, насколько это допустимо. Обычно принято завершать процедуры командой Exit /b
(Рекомендую на всякий пожарный заменить последню строку скрипта)
2. Команда DIR в таком виде даст только названия каталогов, а не файлов.
3. Комада IF без ключа /i не воспринимает сравнение числовых величин.
4. В Команде Move указан только Источник, а Приемник не указан (пропущена пара кавычек).
5. У переносимых файлов нет расширения? (сомневаюсь)
В итоге строка переноса должна выглядить так: For /F "Tokens=1-3 Delims=." %%i In ('DIR /B /A %$SRC%\??.??.????.*') Do If /i %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k.*" "%$DST%\"
zavoruev
12-05-2010, 17:03
Уважаемы NiOl,
при тестировании выполнения данного скрипта, премещение файлов не происходит, вот ошибки в логе
Skiping copy file.cmd (27.04.2010, wait=1)
Skiping creat and copy folders(Є®«-ў® ¤*Ґ©).cmd (05.04.2010, wait=2)
Skiping Creat and copy folders(Є®«-ў® Ї*Ї®Є).cmd (05.04.2010, wait=2)
Skiping Creat folders.cmd (01.04.2010, wait=3)
Skiping Last5.log (27.04.2010, wait=1)
Skiping copy file.cmd (27.04.2010, wait=1)
Skiping creat and copy folders(Є®«-ў® ¤*Ґ©).cmd (05.04.2010, wait=2)
Skiping Creat and copy folders(Є®«-ў® Ї*Ї®Є).cmd (05.04.2010, wait=2)
Skiping Creat folders.cmd (01.04.2010, wait=3)
Skiping Last5.log (27.04.2010, wait=1)
Skiping copy file.cmd (27.04.2010, wait=1)
Skiping creat and copy folders(Є®«-ў® ¤*Ґ©).cmd (05.04.2010, wait=2)
Skiping Creat and copy folders(Є®«-ў® Ї*Ї®Є).cmd (05.04.2010, wait=2)
Skiping Creat folders.cmd (01.04.2010, wait=3)
megaloman
12-05-2010, 18:21
WinRar решает Вашу проблему в одну строчку в назначенных заданиях, и не надо изобретать велосипед. Разве что проблема в лицензии ... Если хотите, напишу
1. Запускать скрипт нужно из каталога, откуда файлы переносятся »
- это приведёт в конце концов к тому, что и скрипт перенесётся и запускать будет нечего. Это совершенно неверно, просто надо указывать полный путь в скрипте.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.