У меня много архивных папок, в которых хранятся файлы резервных копий. каждая папка увеличивается ежедневно.
Мне нужно удалить все файлы, кроме последних 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
, вам нужно как-то обойти это ограничение.
Некоторые альтернативы:
dir
команда для создания списка записей реализует другой сценарий, который выводит только те записи, которые вы хотите удалить (тогда вы можете установить свой N в одном месте)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
когда ты готов.