N 일보다 오래된 파일을 삭제하는 배치 파일
배치 파일에서 7 일보다 오래된 모든 파일을 삭제하는 방법을 찾고 있습니다. 저는 웹을 검색 한 결과 수백 줄의 코드가 포함 된 몇 가지 예제와 작업을 수행하기 위해 추가 명령 줄 유틸리티를 설치해야하는 다른 예제를 찾았습니다.
BASH 에서도 단 몇 줄의 코드로 비슷한 작업을 수행 할 수 있습니다 . Windows의 배치 파일에 대해 적어도 원격으로 쉬운 일을 할 수있는 것 같습니다. 추가 유틸리티없이 표준 Windows 명령 프롬프트에서 작동하는 솔루션을 찾고 있습니다. PowerShell 또는 Cygwin도 사용하지 마십시오.
즐겨:
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"
다음 명령을 실행하십시오 .
ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q
robocopy를 통해 모든 파일 (파일을 이동 한 다음 삭제하는 / move와 달리 파일을 이동 한 다음 삭제하는 / mov 사용)을 robocopy를 통해 다른 위치로 이동 한 다음 해당 경로에서 삭제 명령을 실행하면됩니다. 좋은.
또한 많은 데이터가있는 디렉토리가있는 경우 /mir
스위치 를 사용할 수 있습니다.
Ok는 약간 지루했고, 여기에는 가난한 사람의 Linux epoch 교체 버전이 매일 사용하도록 제한되어 있습니다 (시간 보존 없음).
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 줄의 코드를 추가하지 않을 아이디어가 있다면 계속해서 게시하여 코드에 추가합니다.
epoch : 특정 날짜보다 오래된 파일을 삭제할 필요가 있기 때문에 시간을 고려하지 않았습니다. 몇 시간 / 분이면 보관할 예정인 하루부터 파일을 삭제했을 것입니다.
한정
시대가 허용 한 간단한 날짜 형식 걸리는 것은 YYYY-MM-DD입니다. 다른 설정이나 런타임 평가에 맞게 조정해야합니다 (sShortTime, 사용자 바인딩 구성을 읽고 필터에서 적절한 필드 순서를 구성하고 필터를 사용하여 인수에서 올바른 데이터를 추출).
이 편집기의 자동 서식이 싫다고 언급 했나요? 빈 줄을 제거하고 복사-붙여 넣기는 지옥입니다.
이게 도움이 되길 바란다.
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"
/d -3
(3 일 전) 해야합니다 . 이것은 저에게 잘 작동합니다. 따라서 모든 복잡한 배치는 쓰레기통에있을 수 있습니다. 또한 forfiles
UNC 경로를 지원하지 않으므로 특정 드라이브에 네트워크 연결을 설정하십시오.
비슷한 질문에 대한 내 대답 을 살펴보십시오 .
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")?
여기 에서 다운로드 한 forfiles.exe에 관한이 모든 것 (Win XP에서)
그러나 Windows 서버를 사용하는 경우 files.exe가 이미 있어야하며 ftp 버전과 다릅니다. 그래서 명령을 수정해야합니다.
Windows Server 2003의 경우 다음 명령을 사용하고 있습니다.
forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"
Windows Server 2008 R2의 경우 :
forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"
90 일이 지난 모든 .sql 파일 이 삭제 됩니다.
forfiles를 사용하십시오.
다른 버전이 있습니다. 초기에는 유닉스 스타일 매개 변수를 사용합니다.
내 버전 (서버 2000 용-스위치 뒤에 공백 없음)-
forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"
XP에 forfile을 추가하려면 ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ 에서 exe를 가져옵니다.
C : \ WINDOWS \ system32에 추가합니다.
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에 대한 빠른 "초간 날짜"솔루션이 포함 된 7daysclean.cmd 를 게시 했습니다 . 그러나 정확한 윤년을 고려하지 않습니다. JR 은 현재 연도의 윤일을 고려 하여 추가 기능을 게시 했지만 기본 연도 이후, 즉 1970 년 이후의 다른 윤년은 무시했습니다.
C / C ++로 작성된 응용 프로그램의 날짜 / 시간 변환 함수에서 1970-01-01의 윤일을 포함한 일 수를 빠르게 가져 오기 위해 작은 C 함수로 한 번 생성 된 20 년 동안 정적 테이블 (배열)을 사용합니다.
이 매우 빠른 테이블 방법은 FOR 명령을 사용하는 배치 코드에서도 사용할 수 있습니다 . 그래서이 루틴에 GetSeconds
전달 된 날짜 / 시간 문자열에 대해 1970-01-01 00:00:00 UTC 이후의 초 수를 계산 하는 배치 서브 루틴을 코딩하기로 결정했습니다 .
참고 : Windows 파일 시스템도 윤초를 지원하지 않으므로 윤초는 고려되지 않습니다.
첫째, 테이블 :
윤일을 포함하여 매년 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 epoch로 시작되는 2039 년에서 2106 년의 초를 계산하는 것은 부호없는 32 비트 변수, 즉 C / C ++에서 부호없는 long (또는 부호없는 정수)을 사용하는 경우에만 가능합니다.
그러나 cmd.exe 는 수학적 표현에 부호있는 32 비트 변수를 사용합니다. 따라서 최대 값은 2038-01-19 03:14:07 인 2147483647 (0x7FFFFFFF)입니다.
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
현재 연도의 매월 1 일까지의 일 수입니다.
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 on 명령에서 사용하는 날짜 형식과 다른 경우 환경 변수의 날짜 문자열을 조정해야합니다 %%~tF
.
예를 들어 아래 코드로 %DATE%
확장되는 Sun 02/08/2015
동안 %%~tF
확장되는 02/08/2015 07:38 PM
경우 4 행을 다음과 같이 수정하는 데 사용할 수 있습니다.
call :GetSeconds "%DATE:~4% %TIME%"
그 결과 02/08/2015
평일 약어 3 글자와 구분 공백 문자가없는 날짜 문자열 만 서브 루틴으로 전달됩니다 .
또는 다음을 사용하여 현재 날짜를 올바른 형식으로 전달할 수 있습니다.
call :GetSeconds "%DATE:~-10% %TIME%"
이제 날짜 문자열의 마지막 10 개 문자가 함수에 전달 GetSeconds
되므로 일과 월이 항상 예상되는 순서대로 2 자리 숫자 인 경우 (예 : 또는 형식으로) 환경 변수 DATE 의 날짜 문자열이 평일의 유무에 관계없이 중요하지 않습니다 .dd/mm/yyyy
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 시간 이상 지난 파일인지 확인 에 대한 내 대답을 참조하십시오 .
이 코드를 복사하여 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
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 파일을 보존하고 하위 폴더도 정리합니다.
윤년을 고려하기 위해 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
이미 귀중한이 스레드에 겸손한 기여를 추가 할 수 있습니다. 다른 솔루션이 실제 오류 텍스트를 제거 할 수 있지만 내 응용 프로그램에서 실패를 나타내는 % 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%
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 (및 이전 버전)와 같이 수정되지 않은 버전의 Windows에서 작동하기 때문에 좋은 것이라고 생각 하지만 외부 파일에 쓰기가 필요했습니다. 다음은 호환성을 유지하면서 외부 텍스트 파일을 생성하지 않는 수정 된 버전입니다.
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 이후의 총 일수입니다 (이후에는 음수 연도를 반환 함).
참고 : 수학은 한 방향으로 만 진행됩니다. 음수 입력에서 미래 날짜를 올바르게 가져올 수 없습니다 (시도하지만 해당 월의 마지막 날을 지나갈 가능성이 높습니다).
이런, 이미 많은 답변이 있습니다. 내가 찾은 간단하고 편리한 경로는 & 매개 변수를 사용하여 단일 Windows 명령 줄 명령에서 ROBOCOPY.EXE를 순차적으로 두 번 실행하는 것 입니다.
ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE
이 예에서는 30 일이 지난 모든 파일 ( . )을 선택하여 대상 폴더로 이동하는 방식으로 작동합니다. 두 번째 명령은 PURGE 명령을 추가하여 동일한 작업을 다시 수행합니다. 즉, 원본 폴더에없는 대상 폴더의 파일을 제거합니다. 따라서 기본적으로 첫 번째 명령은 파일을 MOVES하고 두 번째 명령은 두 번째 명령이 호출 될 때 원본 폴더에 더 이상 존재하지 않기 때문에 삭제됩니다.
ROBOCOPY의 설명서를 참조하고 테스트 할 때 / L 스위치를 사용하십시오.
당신은 이것을 풀 수있을 것입니다. 더 간단한 예 를 위해이 질문을 살펴볼 수 있습니다 . 날짜 비교를 시작할 때 복잡성이 발생합니다. 날짜가 더 큰지 아닌지 쉽게 알 수 있지만 실제로 두 날짜의 차이를 알아야하는 경우 고려해야 할 상황이 많습니다.
즉, 타사 도구를 실제로 사용할 수없는 경우가 아니라면이를 발명하지 마십시오.
이것은 놀라운 일이 아니지만 오늘 이와 같은 작업을 수행하고 예정된 작업 등으로 실행해야했습니다.
배치 파일, 아래의 DelFilesOlderThanNDays.bat와 params가있는 샘플 exec :
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
aku의 답변을 확장하면 많은 사람들이 UNC 경로에 대해 묻는 것을 봅니다. unc 경로를 드라이브 문자에 매핑하기 만하면 forfile이 만족스러워집니다. 예를 들어, 드라이브 매핑 및 매핑 해제는 배치 파일에서 프로그래밍 방식으로 수행 할 수 있습니다.
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!"
)
ROBOCOPY 는 저에게 잘 작동합니다. 원래 Iman을 제안했습니다. 그러나 파일 / 폴더를 임시 디렉토리로 이동 한 다음 임시 폴더의 내용을 삭제하는 대신 파일을 휴지통으로 이동하십시오 !!!
다음은 내 백업 배치 파일의 몇 줄입니다.
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 경로를 찾기 만하면됩니다.
이것은 나를 위해 업무용 컴퓨터에 있으며 작동합니다. 귀하 중 일부는 더 제한적인 권한을 가지고 있지만 시도해 볼 수 있음을 이해합니다.) Google에서 ROBOCOPY 매개 변수에 대한 설명을 검색합니다.
건배!
이것은 나를 위해 해냈습니다. 날짜와 함께 작동하며 원하는 금액을 년 단위로 뺄 수 있습니다.
@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
참고 URL : https://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days
'IT박스' 카테고리의 다른 글
PHP를 사용한 jQuery Ajax POST 예제 (0) | 2020.10.02 |
---|---|
메소드 이름이 문자열로 주어 졌을 때 Java 메소드를 어떻게 호출합니까? (0) | 2020.10.02 |
폴더가없는 경우 새로 만듭니다. (0) | 2020.10.02 |
C와 C ++ 모두에서 유효한 코드가 각 언어로 컴파일 될 때 다른 동작을 생성 할 수 있습니까? (0) | 2020.10.02 |
div에서 요소를 수직으로 정렬하는 방법은 무엇입니까? (0) | 2020.09.30 |