2

Я пытаюсь выяснить, как удалить все файлы в папке, которые старше двух дней. Дата последнего изменения не помогает. Мне нужно идти по дате в имени файла. Имя файла будет выглядеть примерно так: AD-YYMMDD-B7D или BB-YYMMDD-A6C или RE-YYMMDD-A13T. Это сложно, потому что имя файла не всегда одинаковой длины. Этот сценарий, который я нашел, выглядит так, как будто он поможет, но я не могу понять, как изменить переменные и как задать путь.

   @ECHO OFF
ECHO Delete By Date Pattern
ECHO Written by: Jason Faulkner
ECHO SysadminGeek.com
ECHO.
ECHO.

REM Delete/Select files based on a date which utilizes MM and/or DD for file naming patterns.
REM
REM Usage:
REM DeleteByDatePattern {/M | /D} NumberToKeep Path PatternPrefix PatternPostfix [/L | /DEL]
REM     /M     Specifies the pattern being used is based on months.
REM     /D     Specifies the pattern being used is based on days.
REM     NumberToKeep
REM            The number of months (/M) or days (/D) to keep, including the current.
REM            For example, entering 1 keeps only the current month/day and 6 would keep the current minus 5.
REM     Path   The root location to search. Subdirectories will be searched.
REM     PatternPrefix
REM            The file search pattern placed before of the month/day when building the search string.
REM     PatternPostfix
REM            The file search pattern placed after of the month/day when building the search string.
REM     /L     (optional) Lists all files matching the pattern, but does not delete them.
REM     /DEL   (optional) Deletes all files matching the pattern.
REM
REM Examples:
REM     DeleteByDatePattern /M 3 "%WinDir%\system32\LogFiles" ex?? ??.log /DEL
REM         Deletes all IIS log files (Windows Server 2003) except for the current and previous two months.
REM     DeleteByDatePattern /D 7 "D:\Backup" *-????-??- .zip /DEL
REM         Deletes all zip files from the D:\Backup folder except for the current week.
REM         The file name pattern assumed above is "*-YYYY-MM-DD.zip"
REM     DeleteByDatePattern /M 0 "C:\" *( )* /L
REM         Prints a list of all files on the C drive matching the pattern: "*-MM-*" (where MM is replaced with 01-12)
REM     DeleteByDatePattern /D 14 "C:\Logs" Log-???? .txt
REM         Prints a list of all patterns which would be processed by the script.

SETLOCAL EnableExtensions EnableDelayedExpansion

REM Assumes your Windows Date/Time settings are set to 'DayOfWeek M/D/YYYY' format.
REM If your format is different, you will need to alter the variables below so they align.
FOR /F "tokens=1,2,3,4 delims=/ " %%A IN ('DATE /T') DO (
    SET Month=%%B
    SET Day=%%C
    SET Year=%%D
)

IF /I {%1}=={/M} (
    SET Keep=%Month%
    SET Max=12
)
IF /I {%1}=={/D} (
    SET Keep=%Day%
    SET Max=31
    REM Working off of the previous month's max days.
    SET /A PrevMonth=%Month%-1
    IF !PrevMonth! EQU 2 (
        SET Max=28
        REM Leap years... add more as needed.
        IF /I %Year% EQU 2012 SET Max=29
        IF /I %Year% EQU 2016 SET Max=29
    )
    IF /I !PrevMonth! EQU 4 SET Max=30
    IF /I !PrevMonth! EQU 6 SET Max=30
    IF /I !PrevMonth! EQU 9 SET Max=30
    IF /I !PrevMonth! EQU 11 SET Max=30
)
SET Current=%Keep%
SET /A Keep=%Keep%-%2+1

REM Determine the range to be removed.
SET /A RemoveHighStart=%Current%+1
IF /I %Keep% LSS 1 (
    SET RemoveLow=0
    SET /A RemoveHighEnd=%Keep%+%Max%-1
) ELSE (
    SET /A RemoveLow=%Keep%-1
    SET RemoveHighEnd=%Max%
)

REM Process all less than the low range.
FOR /L %%Z IN (1,1,%RemoveLow%) DO CALL :Process %%Z %3 %4 %5 %6
REM Process all greater than the high range.
FOR /L %%Z IN (%RemoveHighStart%,1,%RemoveHighEnd%) DO CALL :Process %%Z %3 %4 %5 %6

ENDLOCAL
GOTO End


:Process
SET Key=0%1
SET Key=%Key:~-2%
SET Target="%~2\%~3%Key%%~4"
ECHO Target Pattern: %Target%

IF /I {%5}=={/L} DIR %Target% /B /S
IF /I {%5}=={/DEL} DEL /F /S /Q %Target%
GOTO End

:End

2 ответа2

1

Пакетный файл ниже предполагает, что:

  • Все файлы имеют дату в названии в формате: XX-YYMMDD-XX.ext
  • Год представляет собой двузначное число на основе 2000 года (т. Е. 12 для 2012 года)
  • Ваш языковой формат даты: ММ / ДД / ГГГГ
  • Количество дней для удаления старых файлов указывается в первом параметре (по умолчанию = 2)

,

@echo off
setlocal EnableDelayedExpansion
rem First parameter indicate number of days (default=2)
set days=2
if "%1" neq "" set days=%1

rem Get Julian Day Number from todays date
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
   set /A m=1%%a %% 100, d=1%%b %% 100, set y=%%c
)
set /A A=(m-14)/12, todayJDN = (1461*(y+4800+A))/4 + (367*(m-2-12*A))/12 - (3*((y+4900+A)/100))/4 + d - 32075

rem Process all files
for %%a in (*.*) do (
   rem Get date from file name (second token separated by hypen)
   for /F "tokens=2 delims=-" %%b in ("%%a") do set fileDate=%%b
   rem Get Julian Day Number from file date
   set y=20!fileDate:~0,2!
   set m=1!fileDate:~2,2! %% 100
   set d=1!fileDate:~4,2! %% 100
   set /A A=(m-14)/12, fileJDN = (1461*(y+4800+A))/4 + (367*(m-2-12*A))/12 - (3*((y+4900+A)/100))/4 + d - 32075
   rem Remove files older than given days
   set /A daysOlder=todayJDN - fileJDN
   if !daysOlder! gtr %days% ECHO rem "%%a"
)

Сначала протестируйте программу и проверьте результаты, затем удалите команду ECHO в последней строке, чтобы действительно удалить файлы.

Номер юлианского дня описан здесь: http://www.hermetic.ch/cal_stud/jdn.htm

0

Я не совсем уверен, с какой средой вы работаете, но как часто это нужно делать? Это то, что делается один раз или каждый день? Просто чтобы помочь мне ответить на ваш вопрос, можете ли вы переименовать файлы перед тем, как приступить к решению этой проблемы?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .