Проблема с пакетным скриптом - PullRequest
1 голос
/ 18 ноября 2009

для удаления файлов. Я буду использовать приведенный ниже код для удаления самого старого файла в каталоге и запуска его каждый день. Это произошло из моего вопроса .

Применение к исходному пакетному сценарию:

SET BACKUPDIR=C:\PATH\TO\BACKUPS
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%

Что-то вроде этого проверяет, равно ли количество файлов 21, если это так, удалите самую последнюю:

SET BACKUPDIR=C:\test
SET countfiles = dir BACKUPDIR /b | find /v /c "::"

if countfiles > 21
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%

РЕДАКТИРОВАТЬ: Извините, что забыл вопрос, моя попытка потерпела неудачу, я был бы признателен за любой способ указать, как заставить его работать.

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

сначала, кажется, 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%
)
0 голосов
/ 18 ноября 2009

Это не работает ... вы не можете установить «нормальные» переменные внутри цикла for. У меня была такая же проблема несколько дней назад, и я решил ее с помощью этой записи в блоге .

Как правило, вам нужно установить SETLOCAL ENABLEDELAYEDEXPANSION и затем использовать ! вместо % ...

set FILES=
for /f %%a IN (‘dir /b *.txt’) do set FILES=!FILES! %%a
echo %FILES%

Итак, это должно работать для вас:

SETLOCAL ENABLEDELAYEDEXPANSION
SET OLDEST=
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...