21.08.2011 08:59
OlegON
 
Код:
for /f "tokens=*" %%i in ('forfiles /s /d-15') do del /q /f /s %%i
21.08.2011 09:01
OlegON
 
Попробуйте, оно в ХР работает? Аккуратнее только, из корня-то не запускайте...
Ищу решение чисто через cmd
21.08.2011 18:07
sanekn
 
для файлов
Код:
forfiles -p диск:\путь -s -m *.* -d -кол.дней -c "cmd /c del /q @path"
для каталогов
Код:
forfiles -p диск:\путь -d -кол.дней -c "cmd /c rmdir /s /q @path"
работает через cmd в XP/2003/W7
22.08.2011 09:29
vdm
 
Если "чисто через cmd" - это "без forfiles", то есть такое, работало в 2000
Не идеально, но для удаления старых логов/архивов достаточно.

Код:
@echo off
rem =========================================================================================
rem * Процедура удаления файлов %1 старше %2 дней от текущего, но оставляя не менее %3 дней *
rem * Год в датах обрезается до 2-х цифр, т.о. корректно работает только для файлов с 2000г *

SETLOCAL ENABLEDELAYEDEXPANSION

@echo on
  set DelFiles=%~1
  set MAX_DAYS=%2
  set MIN_DAYS=%3
@echo off

  if "%MAX_DAYS%"=="" ( 
    echo Не задан обязательный параметр MAX_DAYS
    exit /b
  ) 
  if "%MIN_DAYS%"=="" set MIN_DAYS=0

  set /A TIME_SHIFT=MAX_DAYS*24*60

  rem Текущая дата и время, разбиение на части
  set cur_date_time=%DATE:~-10%-%TIME:~,8%
   rem echo %CUR_DATE_TIME%
  FOR /F "tokens=1,2,3,4,5* delims=-.:" %%J in ("%cur_date_time%") do (
    SET CUR_DAY=%%J
    SET CUR_MONTH=%%K
    SET CUR_YEAR=%%L
    SET CUR_HOUR=%%M
    SET CUR_MINUTE=%%N
  )
  SET CUR_YEAR=%CUR_YEAR:~-2%
  SET CUR_HOUR=%CUR_HOUR: =0%

  call :datetime_to_minutes %CUR_YEAR% %CUR_MONTH% %CUR_DAY% %CUR_HOUR% %CUR_MINUTE%
  set CUR_TIME_MINUTES=%ERRORLEVEL%

  rem Цикл по файлам, в порядке даты создания
  pushd %~dp1
  FOR /F "delims=" %%I IN ('dir "%DelFiles%" /a:-d /o:d /t:w /b 2^>nul') DO (

    rem Имя файла и его дата
    set FNAME=%%~nxI
    set FDATETIME=%%~tI
     rem echo !FNAME! !FDATETIME!
    rem Разбиение даты/времени файла на части
    FOR /F "tokens=1,2,3,4,5* delims=-.: " %%J in ("!FDATETIME!") do ( 
      SET FDAY=%%J
      SET FMONTH=%%K
      SET FYEAR=%%L
      SET FHOUR=%%M
      SET FMINUTE=%%N
    ) 
    SET FYEAR=!FYEAR:~-2!

    rem Дата/время файла в минутах
    call :datetime_to_minutes !FYEAR! !FMONTH! !FDAY! !FHOUR! !FMINUTE!
    set FTIME_MINUTES=!ERRORLEVEL!
    set /A FTIME_SHIFT=CUR_TIME_MINUTES-FTIME_MINUTES
     rem echo FTIME_SHIFT=!CUR_TIME_MINUTES!-!FTIME_MINUTES!
     rem echo !FTIME_SHIFT! %TIME_SHIFT%

    rem Удаление файлов с разницей даты/времени больше заданной
    if !FTIME_SHIFT! GTR %TIME_SHIFT% ( 
      rem Проверка, за сколько дней остались архивы
      call :count_filemask_days "%DelFiles%"
      if !ERRORLEVEL! GTR %MIN_DAYS% ( 
        echo %%I ^(!FDATETIME!^) - удаление
        del /q "%%I"
      ) ELSE ( 
        echo %%I ^(!FDATETIME!^) - не удален, т.к. файлов осталось не больше чем за %MIN_DAYS% дн. 
      ) 
    ) 
  ) 
  popd
exit /b


rem Процедура подсчета количества дней, в которых присутствуют заданные по маске файлы %1
:count_filemask_days
  set NF_MASK=%~1
  pushd %~dp1
  set /A CF_DAYS=0
  set NF_LAST_DATE=
  FOR /F "delims=" %%F IN ('dir "%NF_MASK%" /a:-d /o:d /t:w /b 2^>nul') DO ( 
    set NF_NAME=%%~nxF
    set NF_DATETIME=%%~tF
    set NF_DATE=!NF_DATETIME:~0,10!
     rem echo !NF_NAME! !NF_DATE!

    if NOT "!NF_DATE!"=="!NF_LAST_DATE!" ( 
      set /A CF_DAYS=CF_DAYS+1
      set NF_LAST_DATE=!NF_DATE!
    ) 
  ) 
  popd
exit /b %CF_DAYS%


rem Процедура перевода даты/времени в количество минут (без точного учета високосных лет)
:datetime_to_minutes
  rem Приведение параметров к нормальным числам
  set YEAR=%1
  if %YEAR:~0,1%==0 set YEAR=%YEAR:~1%
  set MONTH=%2
  if %MONTH:~0,1%==0 set MONTH=%MONTH:~1%
  set DAY=%3
  if %DAY:~0,1%==0 set DAY=%DAY:~1%
  set HOUR=%4
  if %HOUR:~0,1%==0 set HOUR=%HOUR:~1%
  set MINUTE=%5
  if %MINUTE:~0,1%==0 set MINUTE=%MINUTE:~1%
   rem echo %YEAR% %MONTH% %DAY% %HOUR% %MINUTE%

  rem Определение количества дней, прошедших с начала года до заданного месяца
  SET /A YM_Days=0
  SET /A INYEAR=YEAR/4 
  SET /A NEW_YEAR=INYEAR*4 
  SET /A PR_MONTH=MONTH-1
  FOR /L %%X IN (1,1,%PR_MONTH%) DO ( 
    if %%X==1 (Set /A M_Days=31) 
    if %%X==2 ( 
       IF !NEW_YEAR!==!YEAR! ( 
         Set /A M_Days=29
       ) ELSE ( 
         Set /A M_Days=28 
       ) 
    ) 
    if %%X==3 (Set /A M_Days=31) 
    if %%X==4 (Set /A M_Days=30) 
    if %%X==5 (Set /A M_Days=31) 
    if %%X==6 (Set /A M_Days=30) 
    if %%X==7 (Set /A M_Days=31) 
    if %%X==8 (Set /A M_Days=31) 
    if %%X==9 (Set /A M_Days=30) 
    if %%X==10 (Set /A M_Days=31) 
    if %%X==11 (Set /A M_Days=30) 
    SET /A YM_Days=YM_Days+M_Days
  ) 
  rem Количество минут из количества дней/часов
  set /A MINUTES=(YEAR-1)*365*24*60+YM_Days*24*60+(DAY-1)*24*60+HOUR*60+MINUTE
exit /b %MINUTES%
13.09.2011 11:17
Vekarius
 
rem сохранять 15 файлов
set qfiles=15
set backdir=f:\backup
rem удаление всех файлов rar, созданных ранее последних qfiles из каталога backdir
for /f "skip=%qfiles% delims=:" %%i in ('dir /a-d /b /o-d /tc %backdir%\*.rar') do del /q "%backdir%\%%i"
05.12.2011 15:34
mehanikus
 
А как бы удалить каталоги с содержимым старше Х дней?
06.12.2011 08:49
student
 
Цитата:
mehanikus А как бы удалить каталоги с содержимым старше Х дней?
файлик DELDIR.vbs с содуржимым
==========================
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
Next

For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
Next
End Function
==========================
запуск DELDIR.VBS 14 C:\TEST
где
14 - дни
C:\TEST - стартовый каталог

только это удалит каталоги по ИХ дате, а не по дате содержимого, хотя по идее DateLastModified должна меняться при изменении содержимлого (не проверял)
Часовой пояс GMT +3, время: 19:23.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.