|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Перемещение устаревших файлов из папки в резервную папку |
|
|
CMD/BAT - [решено] Перемещение устаревших файлов из папки в резервную папку
|
Старожил Сообщения: 157 |
Профиль | Отправить PM | Цитировать всем добрый день! Имеется задача перемещения устаревший файлов из папки, но не всех, а только недельной давности, что бы файлы за последнюю неделю сохранялись. Скрипт будет выполняться 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 |
|
Отправлено: 10:11, 02-04-2010 |
Старожил Сообщения: 157
|
Профиль | Отправить PM | Цитировать Товарищи)))) поготите пож-та, я знаю что ошибка у меня вот здесь
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%\" но т.к я не пишу скрипты не пишу, ошибку найти не могу. Жду совета или лучше всего ответа!!! |
Отправлено: 12:52, 05-04-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Неблагодарное занятие - копаццо в чужих скриптах (или в своих старых) - трудно разобраться.
Что сразу бросилось в глаза - в ищите только каталоги (dir /A:D), при этом команда Move может только переименовывать каталоги, но не переносить. Что касается календаря - сам с такими вычислениями в пакетниках не разбирался, здесь мне проверять сложно. |
------- Отправлено: 13:12, 05-04-2010 | #3 |
Старожил Сообщения: 157
|
Профиль | Отправить PM | Цитировать Цитата NiOl:
по этому прошу помочь в составлении нового, либо редактировании старого скрипта На счет команды DIR, вот ключи с которыми она делается, это ни как не каталоги /A Вывод файлов с указанными атрибутами. атрибуты D Каталоги R Доступные только для чтения H Скрытые файлы A Файлы для архивирования S Системные файлы Префикс "-" имеет значение НЕ /B Вывод только имен файлов. И Команда Move Перемещение одного или более файлов: MOVE [/Y | /-Y] [диск:][путь]имя_файла1[,...] назначение Переименование папки: MOVE [/Y | /-Y] [диск:][путь]имя_папки новое_имя_папки Тогда как же переместить папки? |
|
Отправлено: 14:24, 05-04-2010 | #4 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать 1. Прям "Операция-Ы" - "извините, не НАШ, а ВАШ!" - этот скрипт точно не мой, я не люблю переменные записывать в таком формате, да и ремарки через двоеточие - моветон. (ну да это не вопрос, а так, шутки ради)
2. Если вывести DIR с ключем /A - на экране окажутся все файлы и каталоги, а с ключом /A:D - исключительно каталоги (попробуйте в командной строке). Далее, маска файлов/каталогов. До XP маска вида ??.??.???? работала однозначно, а сейчас выходит так, что последний знак вопроса является астериском 3. Папки перемещать очень сложно, появлется куча искажений там, где в файлах и папках встречаются спецсимволы типа пробела и прочих. Самый простой (но медленный ) способ - скопировать xcopy и затем удалить. 4. Вот аккуратный подсчет времени - проблема, которой я ниразу не баловался. Если проблему можно описать другим способом, с более простыми условия, тогда можно попробовать... |
|
------- Отправлено: 15:39, 05-04-2010 | #5 |
Старожил Сообщения: 157
|
Профиль | Отправить PM | Цитировать с удовольствием))) Мне надо что бы в папке оставались файлы недельной давности, этот скрипт я взяд в качестве примера, т.к на рабоих файлах эксперементировать не стал! Хотел добиться одного, перемещение каталогов, а с файлами было бы легче.
Есть папка, в нее скапливаются выгрузки из 1С, формат файла таков DATA260.ARJ и если файл большой то он вот в таком формате DATA265.A01, DATA265.A02, DATA265.A03. эти выгрузки происходят раз в день а иногда и 2 раза. мне необходимо что бы в данной папке после отработки скрипта оставались только файлы недельной давности (их может быть 5, если формат такой DATA260.ARJ, или 15 если формат токой DATA265.A02). Ни каких спец. символов нет. Эти файлы перемещаются для бэкапа в другую папку, где раз в месяц делается бэкап winrar. |
Отправлено: 15:51, 05-04-2010 | #6 |
Старожил Сообщения: 157
|
Профиль | Отправить PM | Цитировать Сейчас попробЫвал сделать тестовый скрипт не для перемещения а для копирования созданных каталогов! результата нет! Вот код:
@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 |
Отправлено: 16:57, 05-04-2010 | #7 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Насколько понимаю - каталог бэкапа не содержит подкаталогов, т.е. достаточно переносить только файлы.
Предлагаю такой вариант решения задачи (если устроит - смогу быстренько накидать) - в папке, где запускается скрипт, остаются все файлы с 5 РАЗЛИЧНЫМИ НАИСВЕЖАЙШИМИ датами. Возможные глюки: Если по какой-то причине в какой-то из дней не появилось новых файлов, то после скрипта останутся файлы не за последние 5 дней, а на 1 день больше. Как такой вариант? ЗЫ: Архивировать *.ARJ винраром - только прибавлять в весе... |
------- Отправлено: 17:56, 05-04-2010 | #8 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Вот:
@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 ) |
------- Отправлено: 18:24, 05-04-2010 | #9 |
Старожил Сообщения: 157
|
Профиль | Отправить PM | Цитировать |
Отправлено: 09:18, 07-04-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
7 / 2008 R2 - Перемещение папки Users в Windows 7 | bab00n | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 28 | 17-03-2015 12:11 | |
V. 5.5/2000/2003 - [решено] Скрипт для чистки общей папки от устаревших сообщений | migunov | Microsoft Exchange Server | 2 | 21-11-2009 09:50 | |
[решено] SVN, как добавить папку в svn-репозиторий без вложенных в папку файлов? | pingUIN | Хочу все знать | 1 | 03-11-2009 17:16 | |
Разное - [решено] Перемещение папки Users | nikkor7 | Microsoft Windows Vista | 2 | 13-04-2009 11:58 | |
[решено] Перемещение папки Users и изменение букв дискам средствами WAIK | alcatraz | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 10 | 28-02-2009 03:04 |
|