2015-01-05 5 views
3

최신 (10 개) 파일 만 모두 제거 :배치 파일 내가 배치 파일에 다음 한

:REMOLDFILES 
ECHO Removing files older than 14 days. >>%LOGFILE% 
cd /d %BKUPDIR% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE% 
IF [%3]==[Y] GOTO SECONDBACKUPDIR 
IF [%3]==[y] GOTO SECONDBACKUPDIR 
GOTO END 

내가에서 실행 문제 백업이 몇 주 동안 실행되지 않은 상태인지를 및 삭제 결국 2 주 이상 지났기 때문에 모든 백업이 완료되었습니다.

내가 필요한 것은 지난 10 개의 최신 백업을 유지하는 것입니다.

누구나 내가 어떻게 그럴 수 있을지 알고 있습니까? 나는 배치 파일에 익숙하지 않았기 때문에 이것을 한 번 쓰지 않았다.

+1

이 코드는 제외하고 모두 삭제해야 가장 최근 ** 14 **'* .log' 파일과'* .zip' 파일이 있습니다. 이 값을 10으로 줄이면 문제가 해결되지 않습니다. 백업 실행 여부는 어떻게 식별합니까? – Magoo

+0

@Magoo - 나도 알아 챘다. (나의 원래 대답은 이것 때문에 14 일을 보냈다.) 그러나 OP는 특별히 10을 요구했다. 나는 그가 이유가 있다고 생각한다. (어쩌면 주말에는 뛰지 않을지도 모른다). –

+0

어떤 OS를 사용하고 있습니까? 'forfiles' 명령을 사용하면 문제를 쉽게 해결할 수 있습니다. – SomethingDark

답변

3

당신이 마지막으로 수정 된 날짜를 기준으로 정렬 한 후 지난 10 개 가장 최근에 수정 항목을 무시 FOR /F SKIP을 사용할 수

for /f "skip=10 eol=: delims=" %%F in ('dir /b /o-d *.zip') do @del "%%F" 
+1

완벽하게 일했습니다! tyvm! – ErocM

+2

틀렸어! 잘못된! 잘못된! 이 코드는 원래 ** ** ** ** ** ** ** ** ** ** 남아있는 반면 ** ** ** ** ** ** Zip 파일을 제외하고 모두 삭제한다는 점을 제외하고는 원래 게시 된 코드 **와 정확히 동일하게 수행됩니다. 그렇지 않으면 실제로'* .zip' 파일 만 처리하고'* .zip * present '라는 이름의 디렉토리가있을 가능성이 거의 없음을 제외하고는 원래 코드와 실제로 똑같은 * 효과가 있습니다. – Magoo

+0

@Magoo - "내가 필요한 것은 지난 10 번의 최신 백업을 유지하는 것입니다." –

1

DIR 명령을 사용하여 수정 된 날짜순으로 파일 목록을 역순으로 가져올 수 있습니다. 그런 다음 FOR 루프가 처음 10 개를 건너 뛰도록 (참고, 게시물 코드는 14이지만 10 개 항목을 요구하므로 처리되는 항목은 모두 삭제됩니다.)

REM Update to 14 if needed. 
SET Keep=10 
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO DEL "%%A">>%LOGFILE% 

당신이 배치에 익숙하기 때문에,이 명령을 테스트 할 수 있습니다 ECHODEL를 대체하여 (대신 실제로 그것을 삭제하는 삭제됩니다을 확인하려면 다음을 참조하십시오). 당신은 또한 로그 파일을 처리하고 있기 때문에


편집

, 왜 그냥 같은 루프를 삭제 하시겠습니까?

REM Update to 14 if needed. 
SET Keep=10 
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO (
    ECHO Processing: %%~nA 
    REM Delete ZIP file. 
    DEL "%%A" 
    REM Delete LOG file. 
    DEL "%%~nA.log" 
)>>%LOGFILE% 
+1

승인 된 응답과 동일한 문제점. 게이트 아웃'* .zip' 디렉토리에'/ a-d'를 생략했습니다 (드물지만 이론상 발생할 수 있습니다.) 불필요한 중복을 피하는 것이 좋습니다. 기본적으로 OP의 코드와 동일하지만 14 대신 10 일입니다. 코드가 로그 파일 항목을 생성하지 않습니다 ... – Magoo

+0

@Magoo - 디렉토리를 전달하면 'DEL' 명령이 실패하지만 좋았습니다 어쨌든 그것을 제외시키는 연습. 로그로의 리다이렉션과 관련하여, 맞습니다. –

+1

참 - 그러나 디렉토리 이름 행에'/ ad'가 없으면 삭제 면제 슬롯 중 하나를 차지할 것이므로 디렉토리는 관계없이 ('del'는 실패하지만)'10'이 아니라'9' * * 파일은 첫 10 줄의 한 줄이 파일이 아닌 디렉토리 일 경우 남아있게됩니다. – Magoo

관련 문제