cmd.exe, bucle for anidado, la variable no se puede usar en opciones como skip=

cmd.exe, bucle for anidado, la variable no se puede usar en opciones como skip=

Tengo muchas carpetas de archivo que almacenan los archivos de respaldo. cada carpeta aumenta diariamente.

Necesito eliminar todos los archivos excepto las N copias recientes en cada uno de ellos, N fue definido por una variable del bucle principal.

%%a es un número del bucle principal, luego use otro bucle for para eliminar

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

Los informes de error

%a" fue inesperado en este momento.

¿Cómo arreglar esto?

Respuesta1

Como no es posible utilizar una variable para skip, es necesario solucionar esa limitación de alguna manera.

Algunas alternativas:

  1. Codifique elnorte(número de copias a conservar) poniendo el valor real en los bucles for
  2. En lugar de usar direl comando en línea para producir la lista de entradas, implemente otro script que genere solo aquellas entradas que desea eliminar (entonces podría configurar sunorteen un solo lugar)
  3. Canalice la salida de dira una utilidad que filtre lanortelíneas desde el principio de la lista (no estoy al tanto de ello, pero es posible que algunas de las utilidades GNU, de las cuales existe un puerto para Windows, puedan hacer eso).

Respuesta2

Puede utilizar una variable en la parte de parámetros de un forbucle, pero no una variable de otro forbucle. Aquí hay un pequeño ejemplo artificial que enumera el contenido del %TEMP%directorio 10 veces, omitiendo una línea más cada vez a través del bucle. Este debería ser un ejemplo representativo de lo que estás intentando hacer:

@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

Respuesta3

Este sería un buen script para escribir en PowerShell.

$n = 5

$FoldersList = Dir e:\Archive

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

En este caso, Powershell crea un script muy limpio y fácil de mantener.

Pruébelo antes de ejecutarlo en su archivo porque yo no lo probé mucho por mi parte. Retire el -WhatIfcuando esté listo.

información relacionada