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

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

GODolubOFF 06-04-2015 18:25 2492421

создание bat файла для удаления старых папок
 
Задача заключается в том, чтобы удалять папки вида ??.??.???? (соответственно вместо вопросиков - дата число.месяц.год)
Есть путь D:\1cBackupElena\v77BackupElena.
Там хранятся папки которые создаются каждый день с помощью батников, которые запускаются в определенное время планировщиком заданий windows 7.
В папках лежат архивы. Баз 1с много, поэтому при запуске батника создается папка с именем ??.??.????, а в ней архивы 7z от каждой базы (то, что как раз с помощью батников создается. Понятное дело, если даже месяц не удалять старые папки с архивами 1С (бэкапами), то жесткого диска не хватит. Поэтому встал вопрос написать батник, который будет работать под планировщиком заданий и удалять папки недельной давности (или другой давности).
Надыбал в просторах скриптик, но он удаляет файлы. Вот код:
@Echo Off
SetLocal enabledelayedexpansion
Set papka=D:\1cBackupElena\v82BackupElena
ForFiles -p %papka% -s -m *.* -d -3 -c "cmd /c del /q @path"
Коротенький, но мне нужно удалять папки с архивами по названию (ну или по дате, специалисты, молю, подскажите как лучше)

Гуллипут 06-04-2015 21:43 2492493

Код:

@Echo Off
SetLocal EnableDelayedExpansion

set minus_days=7
Set papka=D:\1cBackupElena\v82BackupElena

set _dt=!DATE!
 rem set _dt=01.07.2012
set _dt=%_dt:~-10%

set _day=%_dt:~0,2%
set mon=%_dt:~3,2%
set year=%_dt:~6,4%


if %_day% LSS 10 set _day=%_day:~1%
if %mon% LSS 10 set mon=%mon:~1%

set /A _day-=%minus_days%

 rem echo _day=!_day!

if %_day% LSS 0 (
 set /A mon-=1
 if !mon!==0 (
  set mon=12
  set /A year-=1
 )

 if !mon!==2 (
  set /A ost=%year% %% 4
  if !ost!==0 (set /A _day=29+_day) else (set /A _day=28+_day)
  echo ost=!ost!
 ) else (
  set /A _day=31+_day
  for %%m in (4 6 9 11) do if !mon!==%%m set /A _day=_day-1
 )

)

if %_day% LSS 10 set _day=0%_day%
if %mon% LSS 10 set mon=0%mon%

set old=%year%-%mon%-%_day%
echo old=%old%

for /D %%f in (%papka%\*.*) do (
  if not %%f==%0 (
    set dat=_%%~nxf
    set dat=!dat:~7,4!-!dat:~4,2!-!dat:~1,2!
    if !dat! LEQ %old% (
      rd /s /q %%f
    )
  )
)

Похожую задачу я делал в 2012 году, только там надо было удалять устаревшие файлы по дате изменения файла. Так что пришлось только отыскать тот батник и немножко его модифицировать. В принципе, можно ориентироваться не на имя каталога, а на время изменения. Для этого нужно будет заменить строку
Код:

    set dat=_%%~nxf
на
Код:

    set dat=_%%~tf
, как было изначально в том моём батнике.

GODolubOFF 08-04-2015 11:21 2493119

Огромное спасибо тебе камрад! Выручил, осталось только на рабочей машинке проверить работу скрипта)

Опиум 13-04-2015 20:35 2495298

Код:

cd /d D:\1cBackupElena\v77BackupElena
rar32 m -m0  -to7d -r %temp%архив_который_удалим.rar  *.*
del %temp%\архив_который_удалим.rar

рар по-быстрому переместит файлы, старше 7 дней в архив, который потом грохаем.
далее удалить пустые папки командой rd. не пустые папки не удалятся.

три строчки.

Iska 13-04-2015 21:22 2495316

Цитата:

Цитата Опиум
рар по-быстрому переместит файлы »

WinRAR надо ещё купить ;).

Опиум 13-04-2015 23:03 2495353

Iska, хорошо) используем robocopy /MINAGE:7 /MOV


Время: 13:50.

Время: 13:50.
© OSzone.net 2001-