сначала, кажется, set
не любит пробелы между переменной и знаком =
: если вы поставите пробел, имя переменной будет содержать пробел. поэтому вы должны удалить пробел, чтобы правильно определить имя переменной.
Кроме того, ваш синтаксис для захвата вывода команды в переменную неверен. единственный способ, о котором я знаю (после отчаянного поиска ответа на стек в потоке), - использовать трюк цикла for для использования временной переменной (см. этот вопрос для получения дополнительной информации). на самом деле вам также нужно выйти из канала, чтобы команда была правильно проанализирована.
тогда, когда переменная, проверенная в выражении if
, не существует, результаты всегда верны, поэтому убедитесь, что переменная существует. убрав пробел, как сказано выше, имя в выражении if будет соответствовать имени вашей переменной, и тест будет выполнен правильно.
тогда вы забыли сделать блок вокруг двух последних команд. на самом деле, вы тестируете, если у вас более 21 файла, и вычисляете самый старый файл, если он истинный, тогда вы ВСЕГДА удаляете самый старый файл.
также, больше, чем оператор >
можно понимать как перенаправление. вам может понадобиться использовать оператор GTR.
SET BACKUPDIR=C:\test
FOR /F %%i in ('dir BACKUPDIR /b ^| find /v /c "::"') DO SET countfiles=%%i
if countfiles GTR 21 (
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%
)