
백업 파일을 저장하는 보관 폴더가 많이 있습니다. 각 폴더는 매일 증가합니다.
각 파일의 최근 N 복사본을 제외한 모든 파일을 삭제해야 합니다. N은 상위 루프의 변수로 정의되었습니다.
%%a는 상위 루프의 숫자입니다. 그런 다음 다른 for 루프를 사용하여 삭제하세요.
for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x
오류 보고서
%a"는 현재 예상치 못한 결과였습니다.
이 문제를 해결하는 방법은 무엇입니까?
답변1
에는 변수를 사용할 수 없으므로 skip
어떻게든 해당 제한을 해결해야 합니다.
몇 가지 대안:
- 하드코딩N(보관할 복사본 수) for 루프에 실제 값을 넣어서
- 인라인 명령을 사용하여 항목 목록을 생성하는 대신
dir
삭제하려는 항목만 출력하는 다른 스크립트를 구현하십시오.N한 곳에서만) - 출력을
dir
필터링하는 유틸리티로 파이프합니다.N목록 시작 부분부터 줄을 삭제합니다(나는 그런 것을 알지 못하지만 Windows 포트가 있는 일부 GNU 유틸리티가 그렇게 할 수 있을 가능성이 있습니다).
답변2
루프 의 매개변수 부분에서는 변수를 사용할 수 있지만 for
다른 루프의 변수는 사용할 수 없습니다 for
. 다음은 %TEMP%
디렉토리의 내용을 10번 나열하고 루프를 통과할 때마다 한 줄을 더 건너뛰는 약간 조작된 예입니다 . 다음은 수행하려는 작업의 대표적인 예입니다.
@echo off
for /l %%a in (1,1,10) do call :innerloop %%a > %%a.txt
goto :EOF
:innerloop
for /f "usebackq skip=%1" %%i in (`dir /s /a /b "%TEMP%"`) do echo %%i
답변3
이는 PowerShell에서 작성하기에 좋은 스크립트입니다.
$n = 5
$FoldersList = Dir e:\Archive
foreach($Folder in $FoldersList)
{
Dir $Folder |
Sort-Object CreationTime -Descending |
Select-Object -Skip $n |
Remove-Item -whatif
}
이 경우 Powershell은 매우 깨끗하고 유지 관리하기 쉬운 스크립트를 만듭니다.
제가 직접 테스트를 많이 하지 않았기 때문에 아카이브에서 실행하기 전에 테스트해 보세요. -WhatIf
준비가 되면 제거하세요 .