N 일보다 오래된 파일을 삭제하는 배치 파일


678

배치 파일에서 7 일보다 오래된 모든 파일을 삭제하는 방법을 찾고 있습니다. 웹을 검색 한 결과 수백 줄의 코드가 포함 된 예제와 작업을 수행하기 위해 추가 명령 줄 유틸리티를 설치해야하는 예제가 있습니다.

BASH 에서도 몇 줄의 코드로 비슷한 작업을 수행 할 수 있습니다 . Windows에서 배치 파일에 대해 최소한 원격으로 쉬운 작업을 수행 할 수있는 것으로 보입니다. 추가 유틸리티없이 표준 Windows 명령 프롬프트에서 작동하는 솔루션을 찾고 있습니다. PowerShell이나 Cygwin도 없습니다.


8
Jeff Atwood는 Serverfault에서 이에 대해 답변했으며 여기에 문서화해야한다고 생각합니다. serverfault.com/questions/49614/delete-files-older-than-x-days
먼지

내부 CMD.EXE 명령을 사용하는 .BAT 파일 기반의 새로운 방법은 여기에 게시되었습니다 : stackoverflow.com/questions/9746778/…
Aacini

1
gehrcke.de/timegaps 는 이러한 목적으로 설계되었습니다. 심지어 더 복잡한 삭제 구성도 가능합니다. 지난 7 일 동안의 파일을 유지하는 것 외에도 지난 8 주, 12, 개월, 2 년 각각에 대해 하나의 파일을 보관할 수 있습니다.
Dr. Jan-Philip Gehrcke

답변:


1071

즐겨:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

자세한 내용은 forfiles설명서 를 참조하십시오.

자세한 내용 은 Windows XP 명령 줄의 AZ 색인을 참조하십시오 .

forfiles컴퓨터에 설치 하지 않은 경우 Windows Server 2003 에서 Windows XP 컴퓨터 (으)로 복사하십시오 %WinDir%\system32\. EXE는 Windows Server 2003과 Windows XP간에 완벽하게 호환되므로 가능합니다.

최신 버전의 Windows 및 Windows Server에는 기본적으로 설치되어 있습니다.

Windows 7 이상 (Windows 10 포함) :

구문이 약간 변경되었습니다. 따라서 업데이트 된 명령은 다음과 같습니다.

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

12
델 @FILE을해야하는 경우는 테스트하기위한 전 C 에코 @FILE / 사용하는 것이 좋습니다 또한 중요
러셀 스틴을

40
@Russell : @PATH는 이름을 포함한 전체 경로입니다. @FILE은 이름 일 뿐이므로 하위 폴더를 다루는 경우 작동하지 않습니다.
gregmac

86
OLDER 파일을 10 일보다 길게하려면 -d "-10"을 지정해야합니다. -ve는 "보다 큼", + ve는 "보다 큼"을 의미합니다. DDMMYY 또는 -DDMMYY 형식을 -d에 대한 매개 변수로 지정할 수도 있습니다.
gregmac

42
이 구문은 Windows Server 2008에서 사용되었습니다 : forfiles / P "C : \ Mysql_backup"/ S / M * .sql / D -30 / C "cmd / c del @PATH"
jman

9
이 답변은 "7 일 이상 전에"가 아닌 "7 일 이상 전에"가 "7 일 이상 전에 수정 됨"으로 정의 된 경우 작동합니다. 후자는 어떻게 달성 될 수 있습니까?
TimS

76

다음 명령을 실행하십시오 .

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

robocopy를 통해 모든 파일을 이동하고 (/ mov를 사용하여 파일을 이동 한 다음 전체 파일 트리를 이동 한 다음 삭제되는 / move와 반대로 삭제) 파일을 다른 위치로 이동 한 다음 해당 경로에서 삭제 명령을 실행하면 좋은.

또한 데이터가 많은 디렉토리가 있으면 /mir스위치 를 사용할 수 있습니다


5
대부분의 경우 이것은 상당히 비현실적인 답변입니다. 데이터가 많은 디렉토리가 있으면 제대로 작동하지 않습니다. 나는 "제자리에"있는 답 중 하나와 함께 갈 것입니다
adamb0mb

5
@ adamb0mb 이것은 결코 비현실적이지 않습니다. "목적지""source" 와 동일한 파일 시스템에 있으면 이동 작업이 매우 가볍습니다. robocopy는 실제로 강력하기 때문에 실제로 모든 디렉토리 크기, 모호한 파일 이름, 기본적으로 임의의 경로 길이에 대해 작동하며 필요한 경우 디렉토리를 포함합니다. 다른 많은 Windows 유틸리티에 대해 말할 수없는 것입니다. 내가 사용하는 것이 rd /s /q c:\destination대신의 del또는 다른 사용하지만 명령 robocopy /mir c:\emptydir c:\destination은 파일 이름에 문제가 예상되는 경우 디렉토리를 비우 실행.
syneticon-dj 08

12
또한 robocopy는 UNC 경로를 지원 forfiles하지만 허용되는 답변으로는 불가능합니다.
syneticon-dj

3
"내 파일은 이미 내가 원하는 곳에 있습니다. 파일을 옮기고 싶지는 않습니다." "파일 삭제는 논리적으로 수행하는 작업입니다. 그렇게하기 위해 Robocopy에 과부하를주지 마십시오"
adamb0mb

3
C:\test7 일이 지난 모든 파일을 보려면이 라이너를 사용하는 것이 좋습니다 . 파일을 삭제하려면 변경 echodel:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
파워 유저

25

Ok는 조금 지루했고 이것에 대해 생각해 냈습니다. 여기에는 매일 사용하도록 제한된 가난한 사람의 Linux 획기적인 버전이 포함되어 있습니다 (시간 유지 없음).

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

용법

set /a strip=day*7: 보관 일 수로 7 을 변경하십시오 .

set dSource=C:\temp : 파일을 확인할 시작 디렉토리입니다.

노트

이것은 비파괴적인 코드이며, 무슨 일이 있었는지 표시합니다.

변경 :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

같은 것으로 :

if !epoch! LEQ %slice% del /f %%f

파일이 실제로 삭제됩니다

2 월 : 28 일로 하드 코딩되었습니다. Bissextile 년은 정말 추가하기 어려운 지옥입니다. 누군가 10 줄의 코드를 추가하지 않을 아이디어가 있다면 계속해서 게시하여 코드에 추가하십시오.

에포크 : 특정 날짜보다 오래된 파일을 삭제해야하므로 시간 / 분이 걸리면 보관해야 할 하루에서 파일이 삭제되었을 것이므로 시간을 고려하지 않았습니다.

한정

시대가 허용 한 간단한 날짜 형식 걸리는 것은 YYYY-MM-DD입니다. 다른 설정이나 런타임 평가 (sShortTime, 사용자 바인딩 구성 읽기, 필터에서 적절한 필드 순서 구성 및 필터를 사용하여 인수에서 올바른 데이터 추출)에 맞게 조정해야합니다.

이 편집기의 자동 서식을 싫어한다고 언급 했습니까? 빈 줄을 제거하고 복사 붙여 넣기는 지옥입니다.

이게 도움이 되길 바란다.


4
비파괴 코드의 경우 +1이므로 코드 예제를 직접 제공 할 때 명심해야합니다.
Haugholt

5
늦었고 전혀 관련이 없지만 7daysclean.cmdSynth-Punk 밴드의 멋진 이름처럼 들립니다.
Flonk

21
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

당신은해야합니다 /d -3(3 일 전) 이것은 나를 위해 잘 작동합니다. 따라서 모든 복잡한 배치는 휴지통에있을 수 있습니다. 또한 forfilesUNC 경로를 지원하지 않으므로 특정 드라이브에 네트워크로 연결하십시오.


3
다른 답변과 동일한 오류 (허용 된 답변 포함). 이 이상한 습관은 *.*어디에서 왔습니까? 와일드 카드 *.*가 Windows의 모든 파일과 일치하지는 않습니다. .이름 이 있는 파일 만 일치합니다 . OP .는 파일 이름 에 필요한 것에 대해 아무 말도하지 않았습니다 . 올바른 매개 변수는입니다 /M *. 그러나 이것이 기본 설정입니다. 전혀 필요가 없습니다 /M.
AnT

@AnT : 확실합니까? 나는 Windows에서 *.*와 똑같이 행동 한다고 생각 *합니다. 사실, 나는 그것을 내 컴퓨터에서 dir *.*실제로 시도했으며 실제로 test file확장자가없는 파일을 나열했습니다 .
안드레아스 Rejbrand

1
@Andreas Rejbrand : 놀랍습니다. 그러나 치료는 옵션 과 옵션 *.*사이에 일관성이 없습니다 . 내가 위에서 내 댓글 (자신을 그것을 시도)에 명시된 바와 같이 마스크는 실제로 확장명이 파일 이름을 건너 뜁니다. 여기서 재미있는 부분은 MS 설명서 에 이것이 기본값 이라고 명시되어 있다는 것 입니다. 그러나 실생활에서 시도하면 기본값이 실제로 있음을 알 수 있습니다 -모든 파일이 반복됩니다. dir-mforfiles-m *.*-m *.*-m *
AnT

1
이 MS 설명서 페이지 (technet.microsoft.com/en-us/library/cc753551(v=ws.11).aspx)-문서 작성자가 *.*마스크가 적용된 것으로 잘못 판단했기 때문에 많은 오류 (예 : 예)가 포함되어 있습니다. 모든 파일에. "이 이상한 습관"에 대한 나의 결정적인 질문은 실제로 불필요하다. 왜냐하면 치료 *.**그에 상응하는 것은 오랜 기간의 Windows 관습 이기 때문 이다. 그러나 /m옵션은 forfiles어떤 이유로 든 해당 규칙을 위반합니다.
AnT

1
Windows에서 와일드 카드 5 개 에 대한 배경
지식

18

비슷한 질문에 대한대답 을 살펴보십시오 .

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

지정된 날짜보다 오래된 파일을 삭제합니다. 현재 날짜에서 7 일 뒤로 돌아가도록 수정할 수 있다고 확신합니다.

업데이트 : HerbCSO가 위의 스크립트에서 개선되었음을 알았습니다. 대신 그의 버전을 사용하는 것이 좋습니다 .


12

내 명령은

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH -내 경우에는 경로 일뿐이므로 사용해야했습니다. @PATH\@FILE

또한 forfiles /?나에게도 효과가 없지만 forfiles( "?"없이) 제대로 작동 했습니다.

그리고 내가 가진 유일한 질문 : 여러 마스크를 추가하는 방법 (예 : " .log | .bak")?

여기 에서 다운로드 한 forfiles.exe에 관한 모든 (XP에서 승리)

그러나 Windows 서버를 사용하는 경우 forfiles.exe가 이미 있어야하며 ftp 버전과 다릅니다. 그렇기 때문에 명령을 수정해야합니다.

Windows Server 2003의 경우 다음 명령을 사용하고 있습니다.

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"

9

배치 파일로 해결해야 할 상대 날짜 / 시간 관련 질문이 매우 많습니다. 그러나 명령 줄 인터프리터 cmd.exe 에는 날짜 / 시간 계산 기능이 없습니다. 추가 콘솔 응용 프로그램 또는 스크립트를 사용하는 많은 훌륭한 작업 솔루션이 이미 여기, 스택 오버플로의 다른 페이지 및 다른 웹 사이트에 게시되어 있습니다.

날짜 / 시간을 기준으로하는 작업에는 일반적으로 날짜 / 시간 문자열을 결정된 날짜 이후 초로 변환해야합니다. 1970-01-01 00:00:00 UTC가 매우 일반적입니다. 그러나 특정 작업을 지원하는 데 필요한 날짜 범위에 따라 나중에 사용할 수도 있습니다.

Jay 는 명령 줄 인터프리터 cmd.exe에 대한 빠른 "날짜-초"솔루션이 포함 된 7daysclean.cmd 를 게시 했습니다 . 그러나 올바른 윤년을 고려하지는 않습니다. JR 은 현재 연도의 도약 일을 고려 하여 추가 기능을 게시 했지만 기본 연도 이후, 즉 1970 년 이후의 다른 도약은 무시합니다.

나는 C / C ++로 작성된 응용 프로그램의 날짜 / 시간 변환 함수에서 1970-01-01의 윤일을 포함하여 일 수를 빠르게 얻기 위해 작은 C 함수로 한 번 만든 20 년 이후 정적 테이블 (배열)을 사용합니다.

이 매우 빠른 테이블 방법은 FOR 명령을 사용하는 배치 코드에서도 사용할 수 있습니다 . 그래서이 루틴에 GetSeconds전달 된 날짜 / 시간 문자열에 대해 1970-01-01 00:00:00 UTC 이후의 초 수를 계산 하는 배치 서브 루틴을 코딩하기로 결정했습니다 .

참고 : Windows 파일 시스템은 윤초를 지원하지 않으므로 윤초는 고려되지 않습니다.

먼저, 테이블 :

  1. 1970 년 1 월 1 일 이후 00:00:00 윤년을 포함하여 매년 UTC

    1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
    1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
    1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
    2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
    2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
    2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
    2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
    2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
    2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
    2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
    2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
    2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
    2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
    2100 - 2106: 47482 47847 48212 48577 48942 49308 49673
    

    1970-01-01로 시작하는 에포크 (epoch)를 사용하여 2039 년에서 2106 년까지의 초를 계산하는 것은 부호없는 32 비트 변수, 즉 C / C ++에서 부호없는 long (또는 부호없는 int)을 사용하는 경우에만 가능합니다.

    그러나 cmd.exe 는 수학 식에 부호있는 32 비트 변수를 사용합니다. 따라서 최대 값은 2147483647 (0x7FFFFFFF)이며 2038-01-19 03:14:07입니다.

  2. 1970 년에서 2106 년까지의 윤년 정보 (아니오 / 예).

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ year 2100
    
  3. 현재 연도의 매월 첫 날부터 시작하는 일 수입니다.

                       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
    Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335
    

1970-01-01 이후 날짜를 초 단위로 변환하는 것은 해당 테이블을 사용하는 것이 매우 쉽습니다.

주의하십시오!

날짜 및 시간 문자열의 형식은 Windows 지역 및 언어 설정에 따라 다릅니다. 구분자와 환경 변수에 할당 된 토큰 순 Day, MonthYear제에서 FOR의 루프 GetSeconds필요한 경우 로컬 날짜 / 시간 형식에 적합해야한다.

환경 변수 DATE의 날짜 형식이 FOR on 명령 에 의해 사용 된 날짜 형식과 다른 경우 환경 변수의 날짜 문자열을 조정해야합니다 %%~tF.

예를 들어 아래 코드로 %DATE%확장하는 Sun 02/08/2015동안 %%~tF확장하면 02/08/2015 07:38 PM4 행을 다음과 같이 수정하여 사용할 수 있습니다.

call :GetSeconds "%DATE:~4% %TIME%"

결과적으로 02/08/20153 개의 요일 약어와 공백 문자가없는 날짜 문자열 인 서브 루틴으로 전달됩니다 .

또는 다음을 사용하여 현재 날짜를 올바른 형식으로 전달할 수 있습니다.

call :GetSeconds "%DATE:~-10% %TIME%"

이제 날짜 문자열의 마지막 10자가 함수로 전달 GetSeconds되므로 환경 변수 DATE 의 날짜 문자열에 요일이 있거나없는 요일이 있거나없는 경우 형식 dd/mm/yyyy 또는 형식으로 항상 예상되는 순서로 2 자리 숫자를 갖는 한 중요하지 않습니다 dd.mm.yyyy.

다음은 삭제하려는 파일과 C:\Temp폴더 트리 에 보관할 파일을 출력하는 주석을 설명하는 배치 코드입니다 . 첫 번째 FOR 루프의 코드를 참조하십시오 .

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Get seconds since 1970-01-01 for current date and time.
call :GetSeconds "%DATE% %TIME%"
rem Subtract seconds for 7 days from seconds value.
set /A "LastWeek=Seconds-7*86400"

rem For each file in each subdirectory of C:\Temp get last modification date
rem (without seconds -> append second 0) and determine the number of seconds
rem since 1970-01-01 for this date/time. The file can be deleted if seconds
rem value is lower than the value calculated above.

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    rem if !Seconds! LSS %LastWeek% del /F "%%~fF"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "%%~fF"
    ) else (
        echo Keep   "%%~fF"
    )
)
endlocal
goto :EOF


rem No validation is made for best performance. So make sure that date
rem and hour in string is in a format supported by the code below like
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time.

:GetSeconds

rem If there is " AM" or " PM" in time string because of using 12 hour
rem time format, remove those 2 strings and in case of " PM" remember
rem that 12 hours must be added to the hour depending on hour value.

set "DateTime=%~1"
set "Add12Hours=0"
if "%DateTime: AM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if "%DateTime: PM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: PM=%"
    set "Add12Hours=1"
)

rem Get year, month, day, hour, minute and second from first parameter.

for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY
    rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second%

rem Remove leading zeros from the date/time values or calculation could be wrong.
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM,
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM.
if "%Add12Hours%" == "1" (
    if %Hour% LSS 12 set /A Hour+=12
)
set "DateTime="
set "Add12Hours="

rem Must use 2 arrays as more than 31 tokens are not supported
rem by command line interpreter cmd.exe respectively command FOR.
set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009.
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y"
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L"
) else (
    rem Get number of days to year for the years 2010 to 2038.
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y"
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L"
)

rem Add the days to month in year.
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)

rem Add the complete days in month of year.
set /A "Days+=Day-1"

rem Calculate the seconds which is easy now.
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"

rem Exit this subroutine
goto :EOF

최적의 성능을 위해서는 모든 주석, 즉 0-4 선행 공백 후 rem으로 시작하는 모든 행을 제거하는 것이 가장 좋습니다 .

또한 배열을 더 작게 만들 수 있습니다. 즉, 위의 배치 코드에서 현재 지원하는대로 시간 범위를 1980-01-01 00:00:00에서 2038-01-19 03:14:07로 줄입니다 (예 : 2015-01). 아래 코드에서 -01 ~ 2019-12-31은 C:\Temp폴더 트리 에서 7 일이 지난 파일을 실제로 삭제합니다 .

또한 아래의 배치 코드는 24 시간 형식으로 최적화되어 있습니다.

@echo off
setlocal EnableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    if !Seconds! LSS %LastWeek% del /F "%%~fF"
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do (
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )
set /A "Index=Year-2014"
for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y"
for /F "tokens=%Index% delims= " %%L in ("N Y N N N") do set "LeapYear=%%L"
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)
set /A "Days+=Day-1"
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"
goto :EOF

Windows의 날짜 및 시간 형식 및 파일 시간 비교에 대한 자세한 내용은 파일 시간에 대한 추가 정보가 많은 배치 파일에서 파일이 4 시간보다 오래된 지 찾기대한 답변을 참조하십시오 .


9

이 코드를 복사하여로 저장하십시오 DelOldFiles.vbs.

CMD 사용 : cscript //nologo DelOldFiles.vbs 15

15는 15 일이 지난 파일을 삭제하는 것을 의미합니다.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here

8

Windows Server 2008 R2의 경우 :

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

90 일이 지난 모든 .sql 파일 이 삭제 됩니다.


7

파일을 사용하십시오.

다른 버전이 있습니다. 초기 스타일은 유닉스 스타일 매개 변수를 사용합니다.

내 버전 (서버 2000의 경우-스위치 뒤에 공백이 없음)-

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"

XP에 파일을 추가하려면 ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ 에서 exe를 받으십시오.

C : \ WINDOWS \ system32에 추가하십시오.


11
@Kibbee 구문이 다르다는 정답이 아닙니다. 이것은 도움이되는 진정한 시도였습니다. Windows 명령 줄을 거의 알지 못했지만이 작업을 수행하는 데 몇 시간의 좌절을 겪었습니다. 나에게 중요한 정보는 다른 버전 (구문이 다름)이 있고 공백을 제거해야한다는 사실이었습니다. 이 중 어느 것도 원래 답변에 포함되지 않았습니다. (나는 대답에 대해 언급했지만 특권은 없습니다
Aidan Ewen

다른 답변과 동일한 오류 (허용 된 답변 포함). 와일드 카드 입력 *.*모든 파일 forfiles과 일치하지는 않습니다 . 이름이있는 파일 (예 : 확장자 가 있는 파일) 만 일치합니다 . OP 는 파일 이름 에 필요한 것에 대해 아무 말도하지 않았습니다 . 올바른 매개 변수는입니다 . 그러나 이것이 기본 설정입니다. 전혀 필요가 없습니다 . ../M */M
AnT

7

Windows 2012 R2의 경우 다음이 작동합니다.

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

삭제할 파일을 보려면 이것을 사용하십시오.

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"

이것은 Windows Server 2008 이상 및 Windows 7에서도 작동합니다.
kwrl

6

IMO, JavaScript는 점차 범용 스크립팅 표준이되고 있습니다. 다른 스크립팅 언어보다 더 많은 제품으로 제공 될 수 있습니다 (Windows에서는 Windows 스크립팅 호스트를 사용하여 사용 가능). 많은 폴더에서 오래된 파일을 정리해야하므로 여기에 JavaScript 함수가 있습니다.

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\\temp\\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

    for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
    {
        var file = it.item();

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}

각 폴더를 지우려면 clearFolder () 함수에 다른 호출을 추가하십시오. 이 특정 코드는 또한 exe 및 dll 파일을 유지하고 하위 폴더도 정리합니다.


6

윤년을 고려하여 7daysclean.cmd 의이 수정은 어떻 습니까?

10 줄 미만의 코딩으로 수행 할 수 있습니다!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

Mofi로 편집 :

JR이 제공 한 위의 조건 은 유효하지 않은 구문으로 인해 항상 거짓으로 평가 됩니다.

또한 Month GEQ 2하루 더 86400 초를 추가하는 것은 윤년에 3 월에서 12 월까지만 이루어져야하지만 2 월에는 그렇지 않기 때문에 잘못되었습니다.

Jay 가 게시 한 배치 파일 7daysclean.cmd 에서 현재 연도에만 윤일을 고려하는 작업 코드 는 다음과 같습니다.

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs

5

이 귀중한 실에 겸손한 공헌을 할 수도 있습니다. 다른 솔루션이 실제 오류 텍스트를 제거 할 수 있지만 내 응용 프로그램에서 실패를 나타내는 % ERRORLEVEL %을 무시하고 있습니다. 그리고 "No files found"오류가 아닌 한 % ERRORLEVEL %을 합법적으로 원합니다.

몇 가지 예 :

특히 오류 디버깅 및 제거 :

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

oneliner를 사용하여 ERRORLEVEL 성공 또는 실패 반환 :

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

다른 코드의 중간에 배치 파일 컨텍스트 내에서 oneliner를 사용하여 ERRORLEVEL을 0으로 유지 (ver> nul은 ERRORLEVEL을 재설정) :

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

SQL Server 에이전트 CmdExec 작업 단계의 경우 다음을 수행했습니다. 버그인지는 모르겠지만 단계 내 CmdExec은 첫 번째 코드 줄만 인식합니다.

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%

5

어이, 이미 많은 답변. 내가 찾은 간단하고 편리한 경로는 & 매개 변수를 사용하여 단일 Windows 명령 줄 명령에서 ROBOCOPY.EXE를 순차적으로 두 번 실행하는 것 입니다.

ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE

이 예에서는 30 일이 지난 모든 파일 ( . )을 선택하고 대상 폴더로 이동하여 작동합니다. 두 번째 명령은 PURGE 명령을 추가하여 다시 동일하게 수행합니다. 즉, 대상 폴더에서 소스 폴더에없는 파일을 제거합니다. 따라서 기본적으로 첫 번째 명령은 파일을 이동하고 두 번째 명령은 두 번째 명령이 호출 될 때 소스 폴더에 더 이상 존재하지 않기 때문에 삭제됩니다.

테스트시 ROBOCOPY의 설명서를 참조하고 / L 스위치를 사용하십시오.


4

XP 리소스 키트가있는 경우 robocopy를 사용하여 모든 이전 디렉토리를 단일 디렉토리로 이동 한 다음 rmdir을 사용하여 해당 디렉토리 만 삭제할 수 있습니다.

mkdir c:\temp\OldDirectoriesGoHere
robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
rmdir /s /q c:\temp\OldDirectoriesGoHere

4

내 생각 e.James의 대답은 조기 (아마도 이전과) 윈도우 2000 SP4로 윈도우의 수정되지 않은 버전에서 작동하기 때문에 좋은이지만, 외부 파일에 기록이 필요합니다. 호환성을 유지하면서 외부 텍스트 파일을 만들지 않는 수정 된 버전은 다음과 같습니다.

REM del_old.cmd
REM usage: del_old MM-DD-YYYY
setlocal enabledelayedexpansion
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

원래 질문에 충실하려면 여기에 매개 변수로 일 수를 지정하여 호출하면 모든 수학을 수행하는 스크립트가 있습니다.

REM del_old_compute.cmd
REM usage: del_old_compute N
setlocal enabledelayedexpansion
set /a days=%1&set cur_y=%DATE:~10,4%&set cur_m=%DATE:~4,2%&set cur_d=%DATE:~7,2%
for /f "tokens=1 delims==" %%a in ('set cur_') do if "!%%a:~0,1!"=="0" set /a %%a=!%%a:~1,1!+0
set mo_2=28&set /a leapyear=cur_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
set mo_1=31&set mo_3=31&set mo_4=30&set mo_5=31
set mo_6=30&set mo_7=31&set mo_8=31&set mo_9=30
set mo_10=31&set mo_11=30&set mo_12=31
set /a past_y=(days/365)
set /a monthdays=days-((past_y*365)+((past_y/4)*1))&&set /a past_y=cur_y-past_y&set months=0
:setmonth
set /a minusmonth=(cur_m-1)-months
if %minusmonth% leq 0 set /a minusmonth+=12
set /a checkdays=(mo_%minusmonth%)
if %monthdays% geq %checkdays% set /a months+=1&set /a monthdays-=checkdays&goto :setmonth
set /a past_m=cur_m-months
set /a lastmonth=cur_m-1
if %lastmonth% leq 0 set /a lastmonth+=12
set /a lastmonth=mo_%lastmonth%
set /a past_d=cur_d-monthdays&set adddays=::
if %past_d% leq 0 (set /a past_m-=1&set adddays=)
if %past_m% leq 0 (set /a past_m+=12&set /a past_y-=1)
set mo_2=28&set /a leapyear=past_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
%adddays%set /a past_d+=mo_%past_m%
set d=%past_m%-%past_d%-%past_y%
for /f "tokens=*" %%a IN ('xcopy *.* /d:%d% /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

참고 : 위의 코드는 윤년과 매월 정확한 일수를 고려합니다. 유일하게 최대 값은 0/0/0 이후 (음수 연도를 리턴 한 후) 경과 한 총 일 수입니다.

참고 : 수학은 한 방향으로 만 진행됩니다. 음수 입력에서 미래 날짜를 올바르게 가져올 수 없습니다 (시도하지만 마지막 달을 지날 것입니다).


3

이것을 뽑을 수도 있습니다. 간단한 질문위해이 질문을 살펴볼 수 있습니다 . 날짜 비교를 시작할 때 복잡성이 발생합니다. 날짜가 더 큰지 아닌지는 쉽게 알 수 있지만 실제로 두 날짜의 차이를 가져와야 할 경우 고려해야 할 상황이 많이 있습니다.

다시 말해, 실제로 타사 도구를 사용할 수 없다면 이것을 발명하려고 시도하지 마십시오.


3

이것은 놀라운 일이 아니지만 오늘 이와 같은 일을하고 예정된 작업 등으로 실행해야했습니다.

배치 파일, 아래의 DelFilesOlderThanNDays.bat 및 매개 변수가 포함 된 샘플 실행 파일 :

DelFilesOlderThanNDays.bat 7 C : \ dir1 \ dir2 \ dir3 \ logs * .log

echo off
cls
Echo(
SET keepDD=%1
SET logPath=%2 :: example C:\dir1\dir2\dir3\logs
SET logFileExt=%3
SET check=0
IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log")
IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B 
IF [%1] EQU [] echo: number of days not specified? :)
echo(
echo: in path [ %logPath% ]
echo: finding all files like [ %logFileExt% ]
echo: older than [ %keepDD% ] days
echo(
::
::
:: LOG
echo:  >> c:\trimLogFiles\logBat\log.txt
echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt
echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt
echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
::
FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1
IF %ERRORLEVEL% EQU 0 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path"
)
::
::
:: LOG
IF %ERRORLEVEL% EQU 0 (
 echo:  >> c:\trimLogFiles\logBat\log.txt
 echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt
 echo:  >> c:\trimLogFiles\logBat\log.txt
 SET check=1
)
::
::
IF %check% EQU 1 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path"
)
::
:: RETURN & LOG
::
IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt

3

aku의 대답을 확장하면서 많은 사람들이 UNC 경로에 대해 묻는 것을 보았습니다. unc 경로를 드라이브 문자에 매핑하면 파일이 행복해집니다. 예를 들어 배치 파일에서 프로그래밍 방식으로 드라이브 매핑 및 매핑 해제를 수행 할 수 있습니다.

net use Z: /delete
net use Z: \\unc\path\to\my\folder
forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"

7 일이 지난 .gz 확장자를 가진 모든 파일이 삭제됩니다. Z :가 사용하기 전에 다른 것에 매핑되어 있지 않은지 확인하려면 다음과 같이 간단한 작업을 수행 할 수 있습니다

net use Z: \\unc\path\to\my\folder
if %errorlevel% equ 0 (
    forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"
) else (
    echo "Z: is already in use, please use another drive letter!"
)

3

ROBOCOPY 는 저에게 효과적입니다. 원래 내 이만을 제안했습니다. 그러나 파일 / 폴더를 임시 디렉토리로 이동 한 다음 임시 폴더의 내용을 삭제하는 대신 파일을 휴지통으로 이동하십시오 !!!

이것은 백업 배치 파일의 몇 줄입니다.

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS

내 'Temp'폴더에서 15 일이 지난 후 AutoCAD 백업 폴더에서 30 일이 지난 항목을 정리합니다. 줄이 길어질 수 있고 다른 위치에서 재사용 할 수 있기 때문에 변수를 사용합니다. 당신은 당신의 로그인과 관련된 휴지통에 대한 dos 경로를 찾아야합니다.

이것은 나를 위해 작업 컴퓨터에 있으며 작동합니다. 일부 사용자에게는 더 제한적인 권한이 있지만 시도해 볼 수도 있습니다.) ROBOCOPY 매개 변수에 대한 설명은 Google을 검색하십시오.

건배!


1
기존의 두 번째로 많이 언급 된 답변 은 RoboCopy도 지원합니다. 물론 약간 다른 옵션을 사용하지만 기존 답변과 비슷합니다.
Jonathan Leffler

2
게시물에 휴지통으로 파일을 이동하는 새로운 내용이 있습니다. 이것은 Robocopy에서 아직 제안되지 않았으며 내장 된 단일 행 명령을 사용하여 원래 게시물에 완전히 응답합니다. 휴지통에서 파일을 복원 할 수 있기 때문에 'DEL'및 'RMDIR'명령을 결합하는 것보다 효과적입니다. 이봐, 난 아직도 여기에있어-휴식을 줘;)
Shawn Pauliszyn

2

특정 연도보다 오래된 파일을 삭제하는 스크립트 :

@REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR
@REM _______ (given in _olderthanyear variable)
@REM _______ (you must LOCALIZE the script depending on the dir cmd console output)
@REM _______ (we assume here the following line's format "11/06/2017  15:04            58 389 SpeechToText.zip")

@set _targetdir=c:\temp
@set _olderthanyear=2017

@set _outfile1="%temp%\deleteoldfiles.1.tmp.txt"
@set _outfile2="%temp%\deleteoldfiles.2.tmp.txt"

  @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end)

:main
  @dir /a-d-h-s /s /b %_targetdir%\*>%_outfile1%
  @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2%
  @goto :end

:end
  @rem ___ cleanup and exit
  @if exist %_outfile1% del %_outfile1%
  @if exist %_outfile2% del %_outfile2%
  @goto :eof

:process_file_path %1 %2
  @rem ___ get date info of the %1 file path
  @dir %1 | find "/" | find ":" > %2
  @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1
  @goto :eof

:process_line %1 %2
  @rem ___ generate a del command for each file older than %_olderthanyear%
  @set _var=%1
  @rem  LOCALIZE HERE (char-offset,string-length)
  @set _fileyear=%_var:~0,4%
  @set _fileyear=%_var:~7,4%
  @set _filepath=%2
  @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear%
  @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath%
  @goto :eof

:process_error %1 %2
  @echo RC=%1 MSG=%2 %3
  @goto :eof

1

이것은 나를 위해 그것을했다. 날짜와 함께 작동하며 몇 년 만에 원하는 양을 빼서 시간을 거슬러 갈 수 있습니다.

@echo off

set m=%date:~-7,2%
set /A m
set dateYear=%date:~-4,4%
set /A dateYear -= 2
set DATE_DIR=%date:~-10,2%.%m%.%dateYear% 

forfiles /p "C:\your\path\here\" /s /m *.* /d -%DATE_DIR% /c "cmd /c del @path /F"

pause

/Fcmd /c del @path /F힘 특정 파일은 파일이 읽기 전용 수있는 몇 가지 사례에서 삭제 될 수 있습니다.

dateYear연도 변수이며 하위 항목을 원하는대로 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.