
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:
- Codifique oN(número de cópias a serem mantidas) colocando o valor real nos loops for
- Em vez de usar
dir
o 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) - Canalize a saída
dir
para 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 for
loop, mas não uma variável de outro for
loop. 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 -WhatIf
quando estiver pronto.