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

2

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

Eu 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 e 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 erro

% a "foi inesperado no momento.

Como consertar isto?

valpa
fonte

Respostas:

2

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

Algumas alternativas:

  1. Codifique o N (número de cópias a serem mantidas), colocando o valor real nos loops for
  2. Em vez de usar o dircomando inline para produzir a lista de entradas, implemente outro script que produz apenas as entradas que você deseja excluir (você poderá definir seu N em apenas um lugar)
  3. Canalize a saída dirpara um utilitário que filtra as N linhas desde o início da listagem (não estou ciente disso, mas é possível que alguns utilitários do GNU - dos quais existe uma porta do Windows - possam fazer isso) .
zagrimsan
fonte
2

Você pode usar uma variável na parte dos parâmetros de um forloop, mas não uma variável de outro forloop. Aqui está um pequeno exemplo artificial que lista o conteúdo do %TEMP%diretório 10 vezes, pulando mais uma linha de 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
Evan Anderson
fonte
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
}

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

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

kevmar
fonte
Eu não posso usar o PowerShell porque exige mudança de política de segurança no servidor que eu não tenho a direitos de administrador
valpa
Você pode iniciar o PowerShell como este no cmd: powershell.exe -ExecutionPolicy remotesignede a política de segurança é alterada apenas para sua sessão sem alterá-la para o servidor. Não são necessários direitos de administrador.
Kevmar