cmd.exe, 중첩된 for 루프, 변수는 건너뛰기=와 같은 옵션에서 사용할 수 없습니다.

cmd.exe, 중첩된 for 루프, 변수는 건너뛰기=와 같은 옵션에서 사용할 수 없습니다.

백업 파일을 저장하는 보관 폴더가 많이 있습니다. 각 폴더는 매일 증가합니다.

각 파일의 최근 N 복사본을 제외한 모든 파일을 삭제해야 합니다. N은 상위 루프의 변수로 정의되었습니다.

%%a는 상위 루프의 숫자입니다. 그런 다음 다른 for 루프를 사용하여 삭제하세요.

for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x

오류 보고서

%a"는 현재 예상치 못한 결과였습니다.

이 문제를 해결하는 방법은 무엇입니까?

답변1

에는 변수를 사용할 수 없으므로 skip어떻게든 해당 제한을 해결해야 합니다.

몇 가지 대안:

  1. 하드코딩N(보관할 복사본 수) for 루프에 실제 값을 넣어서
  2. 인라인 명령을 사용하여 항목 목록을 생성하는 대신 dir삭제하려는 항목만 출력하는 다른 스크립트를 구현하십시오.N한 곳에서만)
  3. 출력을 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준비가 되면 제거하세요 .

관련 정보