
У меня есть много архивных папок, в которых хранятся резервные копии файлов. Каждая папка увеличивается ежедневно.
Мне нужно удалить все файлы, за исключением последних N копий в каждом из них, N было определено переменной из родительского цикла.
%%a — это число из родительского цикла, затем используйте другой цикл for для удаления
for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x
Отчеты об ошибках
%a" в этот раз было неожиданным.
Как это исправить?
решение1
Поскольку использовать переменную для невозможно skip
, вам нужно как-то обойти это ограничение.
Некоторые альтернативы:
- Жестко закодироватьН(количество копий для сохранения) путем помещения фактического значения в циклы for
- Вместо использования встроенной
dir
команды для создания списка записей реализуйте другой скрипт, который выводит только те записи, которые вы хотите удалить (тогда вы сможете задать свойНтолько в одном месте) - Передавайте вывод
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
когда будете готовы.