cmd.exe, aninhado para loop, a variável não pode ser usada na opção como skip =

2

Eu tenho muitos pasta de arquivo que armazena os arquivos de backup. cada pasta aumenta diariamente.

Eu preciso excluir todos os arquivos, exceto para 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 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 no momento.

Como consertar isso?

    
por valpa 25.11.2014 / 07:05

3 respostas

2

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

Algumas alternativas:

  1. Codifique o N (número de cópias a manter) colocando o valor real nos loops for
  2. Em vez de usar o comando inline dir para produzir a lista de entradas, implemente outro script que produza apenas as entradas que você deseja excluir (você poderá definir seu N em um só lugar )
  3. Canaliza a saída de dir para um utilitário que filtra as linhas N do início da listagem (não estou ciente disso, mas é possível que alguns dos utilitários GNU - dos quais existe uma porta do Windows - poderia fazer isso).
por 25.11.2014 / 11:16
2

Você pode usar uma variável na porção de parâmetros de um loop for , mas não uma variável de outro loop for . Aqui está um pequeno exemplo artificial que lista o conteúdo do diretório %TEMP% 10 vezes, pulando mais uma linha a cada vez através do 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
    
por 25.11.2014 / 17:28
1

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
}

Neste caso, o Powershell faz um script muito limpo e fácil de manter.

Teste-o antes de executá-lo no seu arquivo porque não testei muito do meu jeito. Remova o -WhatIf quando estiver pronto.

    
por 26.11.2014 / 05:34