Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

Вы можете использовать переменную в части параметров 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

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

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

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

Это хороший сценарий для написания в 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 когда ты готов.