cmd.exe, loop for aninhado, a variável não pode ser usada em opções como skip=

cmd.exe, loop for aninhado, a variável não pode ser usada em opções como skip=

Eu tenho muitas pastas de arquivo que armazenam os arquivos de backup. cada pasta aumenta diariamente.

Preciso excluir todos os arquivos, exceto N cópias recentes em cada um deles, N foi definido por uma variável do loop pai.

%%a é um número do loop pai, então use outro loop for para excluir

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

Os relatórios de erros

%a" foi inesperado neste momento.

Como consertar isto?

Responder1

Como não é possível usar uma variável para skip, você precisa contornar essa limitação de alguma forma.

Algumas alternativas:

  1. Codifique oN(número de cópias a serem mantidas) colocando o valor real nos loops for
  2. Em vez de usar diro comando embutido para produzir a lista de entradas, implemente outro script que produza apenas as entradas que você deseja excluir (então você poderá definir seuNem apenas um lugar)
  3. Canalize a saída dirpara um utilitário que filtra oNlinhas desde o início da listagem (não tenho conhecimento disso, mas é possível que alguns dos utilitários GNU - dos quais existe uma porta Windows - possam fazer isso).

Responder2

Você pode usar uma variável na parte de parâmetros de um forloop, mas não uma variável de outro forloop. Aqui está um pequeno exemplo inventado que lista o conteúdo do %TEMP%diretório 10 vezes, pulando mais uma linha a cada vez no loop. Este deve ser um exemplo representativo do que você está tentando fazer:

@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

Responder3

Este seria um bom script para escrever no PowerShell.

$n = 5

$FoldersList = Dir e:\Archive

foreach($Folder in $FoldersList)
{
    Dir $Folder | 
        Sort-Object CreationTime -Descending | 
        Select-Object -Skip $n | 
        Remove-Item -whatif
}

Nesse caso, o Powershell é um script muito limpo e fácil de manter.

Teste-o antes de executá-lo em seu arquivo, porque não testei muito. Remova -WhatIfquando estiver pronto.

informação relacionada