cmd.exe, вложенный цикл for, переменную нельзя использовать в опции, например skip=

cmd.exe, вложенный цикл for, переменную нельзя использовать в опции, например skip=

У меня есть много архивных папок, в которых хранятся резервные копии файлов. Каждая папка увеличивается ежедневно.

Мне нужно удалить все файлы, за исключением последних N копий в каждом из них, N было определено переменной из родительского цикла.

%%a — это число из родительского цикла, затем используйте другой цикл for для удаления

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

Отчеты об ошибках

%a" в этот раз было неожиданным.

Как это исправить?

решение1

Поскольку использовать переменную для невозможно skip, вам нужно как-то обойти это ограничение.

Некоторые альтернативы:

  1. Жестко закодироватьН(количество копий для сохранения) путем помещения фактического значения в циклы for
  2. Вместо использования встроенной dirкоманды для создания списка записей реализуйте другой скрипт, который выводит только те записи, которые вы хотите удалить (тогда вы сможете задать свойНтолько в одном месте)
  3. Передавайте вывод dirутилите, которая отфильтровываетНстроки из начала листинга (мне о таких не известно, но возможно, что некоторые утилиты GNU, для которых существует порт под Windows, могут это делать).

решение2

Вы можете использовать переменную в разделе параметров цикла for, но не переменную из другого forцикла. Вот небольшой надуманный пример, который перечисляет содержимое каталога %TEMP%10 раз, пропуская еще одну строку каждый раз в цикле. Это должен быть показательный пример того, что вы пытаетесь сделать:

@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

решение3

Это был бы хороший сценарий для написания на PowerShell.

$n = 5

$FoldersList = Dir e:\Archive

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

В этом случае Powershell позволяет создать очень понятный и простой в обслуживании скрипт.

Проверьте его, прежде чем запускать его в своем архиве, потому что я не тестировал его много со своей стороны. Удалите, -WhatIfкогда будете готовы.

Связанный контент