source

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

ittop 2023. 4. 17. 22:26
반응형

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

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

BASH 에서도, 몇줄의 코드로 같은 작업을 실시할 수 있습니다.Windows 의 배치 파일에는, 적어도 리모트로 간단하게 실시할 수 있는 것이 있는 것 같습니다.별도의 유틸리티 없이 표준 Windows 명령 프롬프트에서 작동하는 솔루션을 찾고 있습니다.PowerShell이나 Cygwin도 사용하지 마십시오.

즐길 수 있다:

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

상세한 것에 대하여는, 메뉴얼을 참조해 주세요.

자세한 내용은 Windows XP 명령줄A-Z 인덱스를 참조하십시오.

★★★가forfilesWindows Server 2003 에서 Windows XP 머신에 카피합니다.%WinDir%\system32\「Windows Server 2003」Windows XP windows의과 。

최신 버전의 Windows 및 Windows Server에서는 기본적으로 설치됩니다.

Windows 7 이후(Windows 10 포함)의 경우:

구문이 조금 바뀌었어요.따라서 업데이트된 명령어는 다음과 같습니다.

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

다음 명령을 실행합니다.

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

모든 파일을 robocopy를 통해 (삭제된 파일 트리 전체를 이동하는 /move가 아닌 /mov를 사용하여) 다른 위치로 이동한 후 해당 경로에서 delete 명령을 실행하면 됩니다.

, 되어 있는 는, 「 」, 「 」, 「 」, 「 」, 「 」를 수 있습니다./mir

Ok는 조금 지루해져서 이것을 생각해 냈습니다.그것에는, 일상의 사용에 한정되어 있는 가난한 사람의 Linux 에폭 치환의 내 버전이 포함되어 있습니다(시간 보존 없음).

7일간 클린.클라이언트

@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일로 하드코드 되어 있습니다.십육분위수 년수는 정말 추가하기가 어렵습니다. 만약 누군가가 10줄의 코드를 추가하지 않는 아이디어를 가지고 있다면, 제 코드에 추가할 수 있도록 게시해 주세요.

epoch : 특정 날짜보다 오래된 파일을 삭제해야 하기 때문에 시간을 들이지 않았습니다. 시간이나 몇 분이면 보관 예정일로부터 파일을 삭제할 수 있습니다.

제한

epoch는 짧은 날짜 형식이 YYY-MM-DD인 것을 당연하게 받아들입니다.다른 설정 또는 런타임 평가에 적합해야 합니다(sShortTime, 사용자 바인딩 구성 읽기, 필터에 적절한 필드 순서 설정 및 필터를 사용하여 인수에서 올바른 데이터를 추출).

내가 이 에디터의 자동 포맷이 싫다고 말했던가?빈 줄을 제거하고 복사하는 것은 지옥입니다.

이게 도움이 됐으면 좋겠어요.

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

/d -3 (3일 전 .저는 이거면 돼요.그래서 모든 복잡한 묶음들은 쓰레기통에 버려질 수 있다. 한 also도.forfilesUNC 경로를 지원하지 않으므로 특정 드라이브에 네트워크를 연결합니다.

비슷한 질문에 대한 제 답변을 보세요.

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가 개선되었습니다.대신 그의 버전을 사용하는 것을 추천합니다.

내 명령은

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

@PATH제에는 그냥 에 - 를 해야만 .@PATH\@FILE

, 「」도 있습니다.forfiles /?도 안 forfiles 없이) 잘

그리고 궁금한 것은 여러 마스크를 추가하는 방법뿐입니다(를 들어 ".log|.bak").

이 모든 것이 파일들에 대한 것입니다.여기서 다운로드한 exe (Windows XP의 경우)

그러나 Windows Server for files를 사용하는 경우.exe가 이미 존재하며 ftp 버전과는 다릅니다.그래서 명령어를 수정해야 합니다.

Windows Server 2003 에서는, 다음의 커맨드를 사용하고 있습니다.

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

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"

배치 파일로 해결해야 할 상대적인 날짜/시간 관련 질문이 종종 있습니다.하지만 명령줄 인터프리터 cmd.exe에는 날짜/시간 계산에 대한 함수가 없습니다.추가 콘솔 어플리케이션 또는 스크립트를 사용하여 동작하는 많은 솔루션이 이미 여기, Stack Overflow의 다른 페이지 및 기타 웹 사이트에 게시되어 있습니다.

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

Jay는 명령줄 인터프리터 cmd.exe용 고속 "date to seconds" 솔루션을 포함한 7daysclean.cmd를 게시했습니다.그러나 J.R.는 금년의 윤일을 고려하지만 기준년 이후, 즉 1970년 이후의 다른 윤년은 무시한다는 추가 정보를 게시했다.

C/C++로 작성된 어플리케이션에서 1970-01-01의 윤일수를 포함한 일수를 빠르게 취득하기 위해 C 함수가 작은 정적 테이블(어레이)을 20년 전부터 사용하고 있습니다.

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

주의: Windows 파일시스템도 윤초를 지원하지 않기 때문에 윤초는 고려되지 않습니다.

첫 번째 표는 다음과 같습니다.

  1. 1970-01-01 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이 시작되는 에폭에서 2039~2106년의 초를 계산하는 것은 부호 없는 32비트 변수, 즉 C/C++에서 부호 없는 긴(또는 부호 없는 int)를 사용하는 경우에만 가능합니다.

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

  2. 1970년부터 2106년까지의 윤년 정보(No/Yes).

    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,Month ★★★★★★★★★★★★★★★★★」Year번째 FOR 루프에서GetSeconds필요한 경우 로컬 날짜/시간 형식에 맞게 조정해야 합니다.

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

를 들면, 「 」의 경우는,%DATE%Sun 02/08/2015 동시에%%~tF02/08/2015 07:38 PM에서 4행으로 수 .

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

.02/08/2015 문자열 - 요일 약어 3글자, 구분 공백 3글자.

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

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

날짜 .GetSeconds따라서 환경변수 DATE의 date 문자열이 평일인지 아닌지는 중요하지 않습니다.day와 month가 항상 예상된 순서(예: 형식)의 2자리 숫자이면 됩니다.dd/mm/yyyy ★★★★★★★★★★★★★★★★★」dd.mm.yyyy.

은 삭제해야 할 해야 할 입니다.C:\Temp폴더 트리, 첫 번째 FOR 루프 코드를 참조하십시오.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
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=" %%# in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~t#:0"
    set "FullFileName=%%#"
    setlocal EnableDelayedExpansion
    rem if !Seconds! LSS %LastWeek% del /F "!FullFileName!"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "!FullFileName!"
    ) else (
        echo Keep   "!FullFileName!"
    )
    endlocal
)
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 not "%DateTime: AM=%" == "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if not "%DateTime: PM=%" == "%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%"  == "0" if not "%Month:~1%"  == "" set "Month=%Month:~1%"
if "%Day:~0,1%"    == "0" if not "%Day:~1%"    == "" set "Day=%Day:~1%"
if "%Hour:~0,1%"   == "0" if not "%Hour:~1%"   == "" set "Hour=%Hour:~1%"
if "%Minute:~0,1%" == "0" if not "%Minute:~1%" == "" set "Minute=%Minute:~1%"
if "%Second:~0,1%" == "0" if not "%Second:~1%" == "" 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 two 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개의 선행 공백 뒤에 렘으로 시작하는 모든 행을 삭제하는 것이 가장 좋습니다.

를 작게 위 에서 현재 ~합니다. 현재 위의 배치 코드에서 지원되는 시간 범위를 1980-01-01 00:00:00 ~ 2038-01-19 03:14:07로 단축할 수 있습니다.예를 들어, 아래 코드는 7일보다 오래된 파일을 실제로 삭제합니다.C:\Temp폴더 트리

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

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

for /F "delims=" %%# in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~t#:0"
    set "FullFileName=%%#"
    setlocal EnableDelayedExpansion
    if !Seconds! LSS %LastWeek% del /F "!FullFileName!"
    endlocal
)
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%"  == "0" if not "%Month:~1%"  == "" set "Month=%Month:~1%"
if "%Day:~0,1%"    == "0" if not "%Day:~1%"    == "" set "Day=%Day:~1%"
if "%Hour:~0,1%"   == "0" if not "%Hour:~1%"   == "" set "Hour=%Hour:~1%"
if "%Minute:~0,1%" == "0" if not "%Minute:~1%" == "" set "Minute=%Minute:~1%"
if "%Second:~0,1%" == "0" if not "%Second:~1%" == "" 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시간 이상인지 검색에서 답변을 참조하십시오.

3일보다 오래된 모든 파일 삭제

forfiles -p "C:\folder" -m *.* -d -3 -c "cmd  /c del /q @path"

3일보다 오래된 디렉토리 삭제

forfiles -p "C:\folder" -d -3 -c "cmd  /c IF @isdir == TRUE rd /S /Q @path"

Windows Server 2008 R2의 경우:

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

90일보다 오래된 모든 .sql 파일이 삭제됩니다.

하여 로 합니다.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

forfiles를 사용합니다.

여러 가지 버전이 있습니다.초기 버전에서는 unix 스타일의 파라미터를 사용합니다.

My version (서버 2000의 경우 - 스위치 후 공백 없음 주의)-

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

XP에 for 파일을 추가하려면 ftp://ftp.microsoft.com/ResKit/y2kfix/x86/에서 exe를 가져옵니다.

C:\에 추가합니다.WINDOWS\system32

IMO, JavaScript는 점차 범용 스크립트 표준이 되어가고 있습니다.아마 다른 스크립트 언어보다 더 많은 제품에서 사용할 수 있을 것입니다(Windows에서는 Windows Scripting Host를 사용하여 사용할 수 있습니다).많은 폴더에 있는 오래된 파일을 삭제해야 하므로 이를 위한 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 파일도 보존하고 하위 폴더도 정리합니다.

윤년을 고려하여 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에 의한 편집:

J.R.제공한 위의 조건은 구문이 잘못되었기 때문에 항상 false로 평가됩니다.

★★★★★★★★★★★★★★★★★.Month GEQ 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

이미 가치 있는 이 줄거리에 보잘것없는 공헌을 더해도 될까요?다른 솔루션에서는 실제 에러 텍스트는 삭제될 수 있지만 어플리케이션의 실패를 나타내는 %ERROR LEVEL%는 무시되고 있습니다.또한 "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

ONLINER를 사용하여 ERROR LEVEL 성공 또는 실패 반환:

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를 사용하여 ERROR LEVEL을 다른 코드 중간에 배치 파일의 컨텍스트 내에서 정상적으로 유지하면(ver > nul), ERROR LEVEL이 리셋됩니다.

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 Agent 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%

이런, 벌써 답이 많네요.내가 찾은 간단하고 편리한 경로는 로보코피를 실행하는 것이었다.단일 Windows 명령줄 명령에서 & 파라미터를 사용하여 EXE를 순차적으로 두 번 실행합니다.

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

이 예에서는 30일 이상 경과한 모든 파일(.)을 선택하여 타깃폴더로 이동합니다.두 번째 명령어는 소스 폴더에 존재하지 않는 대상 폴더에 있는 파일을 제거하는 PURGE 명령을 추가하여 동일한 작업을 다시 수행합니다.즉, 첫 번째 명령어는 MOVES files, 두 번째 명령어는 두 번째 명령어가 호출될 때 소스 폴더에 존재하지 않으므로 두 번째 명령어는 MOVES files, 두 번째 DELETES입니다.

ROBOCOPY의 매뉴얼을 참조하여 /L 스위치를 사용하여 테스트합니다.

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

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

나는 e라고 생각한다.James의 답변은 수정되지 않은 Windows 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 이후(그 후 음의 해가 반환됨)의 총 일수입니다.

메모: 계산은 한 방향으로만 진행되며, 음의 입력으로부터 미래의 날짜를 올바르게 얻을 수 없습니다(이 계산은 시도되지만 월의 마지막 날을 지나게 됩니다).

로보코피가 저한테 잘 어울려요.원래 내 이만을 제안했어.그러나 파일/폴더를 임시 디렉토리로 이동한 후 임시 폴더의 내용을 삭제하는 대신 파일을 휴지통으로 이동합니다!!!

다음은 백업 배치 파일의 몇 줄 예입니다. 예를 들어 다음과 같습니다.

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 파라미터에 대한 설명은 구글에서 검색하십시오.

건배!

당신은 이것을 해낼 수 있을 거예요.질문을 보시면 좀 더 간단한 예시를 들 수 있습니다.날짜를 비교하기 시작하면 복잡해집니다.날짜가 더 큰지 아닌지는 쉽게 알 수 있지만, 실제로 두 날짜의 차이를 알 필요가 있는지 고려해야 할 많은 상황이 있습니다.

즉, 서드파티 툴을 사용할 수 없는 경우가 아니라면, 이 툴을 발명하려고 하지 마십시오.

대단한 건 아니지만, 오늘 이런 일을 해야 했고, 스케줄대로 일을 해야 했어요.

배치 파일, Dell Files Older Than다음 NDays.bat 샘플 exec(파라미터 포함):

델 파일 오래된 파일NDays.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

aku의 답변에 대해 자세히 설명하자면 UNC의 경로에 대해 많은 사람들이 물어보고 있습니다.unc 경로를 드라이브 문자에 매핑하는 것만으로 forfiles가 만족할 수 있습니다.예를 들어, 배치 파일에서 드라이브의 매핑 및 매핑 해제를 프로그래밍 방식으로 수행할 수 있습니다.

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"

확장자가 .gz인 7일보다 오래된 파일은 모두 삭제됩니다.사용하기 전에 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!"
)

이건 날 위해 한 거야날짜와 함께 사용할 수 있으며 원하는 금액을 년 단위로 줄여 과거로 되돌릴 수 있습니다.

@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

/F cmd /c del @path /F파일을 읽기 전용으로 할 수 있는 경우에 따라서는, 특정의 파일을 강제적으로 삭제합니다.

dateYear를 자신의 할 수 있습니다.거기서 서브트랙트를 필요에 따라 변경할 수 있습니다.

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

@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

보다 유연한 방법은 다음과 같습니다.

@echo off

::::::::::::::::::::::
set "_DIR=C:\Users\npocmaka\Downloads"
set "_DAYS=-5"
::::::::::::::::::::::

for /f "tokens=* delims=" %%# in ('FileTimeFilterJS.bat  "%_DIR%" -dd %_DAYS%') do (
    echo deleting  "%%~f#"
    echo del /q /f "%%~f#"
)

이 스크립트를 사용하면 일, 분, 초 또는 시간과 같은 측정을 사용할 수 있습니다.작성, 액세스 또는 수정 시 파일을 필터링할 날씨를 선택하려면 특정 날짜 이전 또는 이후(또는 두 날짜 사이) 파일을 나열해야 합니다.파일 또는 dir(또는 둘 다)를 표시할지 여부를 선택하려면

언급URL : https://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days

반응형