Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удалить все файлы из папки кроме нужных (http://forum.oszone.net/showthread.php?t=190684)

Sirimika 09-11-2010 11:43 1538335

Удалить все файлы из папки кроме нужных
 
В папку каждый день записываются новые файлы. Требуется в конце каждого месяца удалить все файлы, кроме файлов за первый день месяца (первым днем может быть как 1-е число, так и 2-е) Как это реализовать?

amel27 09-11-2010 12:18 1538359

Sirimika, от чего плясать?.. от даты копирования на диск, даты изменения (см. описание ключа /T из "HELP DIR") или дату можно выдернуть из имени файла?.. просто все эти даты могут существенно отличаться друг от друга... например, если архивирование начать сегодня вечером, то закончиться оно может завтра утром, а на сетевую шару файл архива может попасть и вовсе послезавтра (в зависимости от скорости канала и т.д.)

Sirimika 09-11-2010 12:21 1538361

В названии файла дата имеется и она совпадает с датой изменения документа, так что смотреть можно по любой. Формат даты в названии xxxx-20101207.bak.
xxxx - это собственно название файла
дата соответственно получается в формате гмд

gora 09-11-2010 14:21 1538453

Код:

@Echo Off
SetLocal enabledelayedexpansion
Set src=e:\Temp\1
If Exist "%src%\*%Date:~6,4%%Date:~3,2%01.bak" (Set msc=01) Else Set msc=02
For /R "%src%" %%a In (*.bak) Do (
        Set tna=%%~na
        If Not !tna:~-8!==%Date:~6,4%%Date:~3,2%%msc% Del /F /Q "%%a"
)

Проверит наличие файлов .bak за первое число текущего месяца и года и при наличии таковых удалит все остальные файлы .bak из папки. Если за первое число файлов .bak нет, то удалит все файлы .bak кроме файлов за второе число текущего месяца и года.

Sirimika 09-11-2010 15:31 1538517

Цитата:

Цитата gora
"%src%\*%Date:~6,4%%Date:~3,2%01.bak" »

Не очень понятно, что значит данная запись, распишите пожалуйста

gora 09-11-2010 15:42 1538527

Цитата:

Цитата Sirimika
Не очень понятно, что значит данная запись, распишите пожалуйста »

%src% - путь к Вашей папке (в моем случае это e:\Temp\1)
* - любые символы в любом количестве, например, Ваши xxxx- заменяются одной этой звездочкой
%Date:~6,4% - текущий год (4 цифры)
%Date:~3,2% - текущий месяц (2 цифры)
01 - первое число месяца

В итоге получаем : "e:\Temp\1\*20101101.bak"

Sirimika 09-11-2010 16:09 1538542

еще наверно глупый вопрос задам.
Почему значения именно 6 и 3?

gora 09-11-2010 16:19 1538548

Код:

Формат переменной %Date% для русской локализации    -  09.11.2010
Отсчет номера символа с левого края (начинается с 0) -  0123456789

Подробнее: Set /?

Sirimika 09-11-2010 16:23 1538555

еще вопрос возникает. Всегда должно оставаться три файла, например:
базаА-20101207.bak
базаБ-20101207.bak
базаС-20101207.bak.

Но проблема может быть в том, что одна из баз сделает бэкап например следующим днем(изменят расписание или еще что-нить), если воспользоваться скриптом, который сейчас, то у меня останется только 2 файла. А надо чтобы всегда было со всех баз, даже если у них разница в день или несколько дней. У меня всегда должны быть быкапы всех трех баз от начала месяца

amel27 10-11-2010 05:00 1538990

Цитата:

Цитата Sirimika
Всегда должно оставаться три файла »

если понимать так, что на каждые месяц/базу оставить один 1-й файл:
Код:

@echo off
SetLocal EnableDelayedExpansion

for /f "delims=" %%a in ('dir /b/on *.bak') do (
  set "$na=%%~na"& set "$x=$_!$na:~0,-2!"
  if not defined !$x! (set "!$x!=X") else del "%%a"
)

P.S. в имени файла архива не должно быть пробелов/спецсимволов

Sirimika 10-11-2010 09:44 1539072

в таком случае он удаляет только то, что в текущем месяце, а мне надо еще удалить все прошлые записи

amel27 10-11-2010 10:11 1539097

Sirimika, да нет, для каждого ключа (имя файла без последних двух цифр месяца числа) скрипт оставляет только первый по порядку, все последующие файлы с таким же ключом удаляются:

Код:

базаA-20101107.bak - оставить
базаA-20101108.bak - удалить
базаA-20101110.bak - удалить
|-----------|
    ключ


Sirimika 10-11-2010 10:52 1539126

amel27, это я поняла. В итоге получим, бэкап с каждой базы за первое число каждого месяца. Но мне требуется получить только за текущий месяц.
У меня лежит куча бэкапов за различные месяца, мне надо чтобы в конце месяца отработал батник и удалил все кроме 3-х бекапов каждой базы текущего месяца.

Пример того что должно остаться:
базаA-20101107.bak
базаБ-20101108.bak
базаС-20101107.bak

То что останется если отработает этот батник:
базаA-20101107.bak
базаБ-20101108.bak
базаС-20101107.bak

базаA-20101007.bak
базаБ-20101008.bak
базаС-20101007.bak

базаA-20100907.bak
базаБ-20100908.bak
базаС-20100907.bak

amel27 10-11-2010 11:40 1539165

Цитата:

Цитата Sirimika
отработал батник и удалил все кроме 3-х бекапов каждой базы текущего месяца »

тогда уж "кроме 1-го бэкапа каждой базы ...":
Код:

@echo off
SetLocal EnableDelayedExpansion

for /f "delims=" %%a in ('dir /b/on *.bak') do (
  set "$na=%%~na"& set "$b=$_!$na:~0,-8!"& set "$m=!$na:~-8,6!"
  if defined !$b! del "%%a"
  if not defined !$b! if "!$m!"=="%DATE:~-4%%DATE:~3,2%" (
set "!$b!=%%a") else del "%%a")


Sirimika 12-11-2010 09:49 1540747

Добрый день.
Я наверно опять с глупым вопросом, но не могли бы вы пояснить один момент:
переменная $b принимает такие значения как $b=$_mysql- ($_psql-, $_www-)

На этапе
Код:

if defined !$b! del "%%a"
считается что $b не определена, но после того, как один раз отработает
Код:

set "!$b!=%%a"
, переменная принимает одно из значений $b=mysql-20101015.bak (psql-20101015.bak,www-20101015.bak).
Не понимаю когда $b становиться опять не определена, почему остаются все три файла mysql, psql, www, а не один mysql

Буду очень признательна за подробный ответ.

gora 12-11-2010 10:09 1540761

Цитата:

Цитата Sirimika
не могли бы вы пояснить »

Попробую.
Есть переменная $b, мы определяем ее значение:
Код:

set "$b=name1"
Мы можем проверить, определена ли у нас эта переменная $b, так:
Код:

if defined $b ...
А такое написание:
Код:

if defined !$b! ...
проверяет не переменную $b, а переменную с именем содержащимся в переменной $b, т.е., в нашем случае это переменная с именем name1
Соответственно эта строка:
Код:

set "!$b!=%%a"
присваивает переменной name1 значение из переменной %%a

Sirimika 12-11-2010 10:33 1540785

gora, огромное спасибо. Теперь все стало понятно и просто =)


Время: 03:00.

Время: 03:00.
© OSzone.net 2001-