Войти

Показать полную графическую версию : [решено] Не работает команда set /a


mark23
27-06-2011, 23:07
здравствуйте, прошу Вас помочь в решении одной задачи.

в определенном каталоге находятся архивы, которые именуются по дате их создания, пример названия таких файлов:
2011.06.05-12.00.00.7z
2011.06.06-12.00.00.7z
2011.06.07-12.00.00.7z
2011.06.08-12.00.00.7z

требуется хранить в каталоге ТОЛЬКО три последних (по дате их создания) архива - а остальные удалить
(т.е. удалим файл - 2011.06.05-12.00.00.7z - т.к. он самый поздний )
мое решение - скрипт следующего содержания:
===================================
set S=3

for /F "Delims=" %%i in ('dir /B /O:N *.7z') do (
set /a S-=1
if /I S LEQ 0 DEL %%i
)
===================================
скрипт отрабатывается, ошибок не выдает, но команда set /a S-=1 не выполняется - не выполнение заключается в том что значение S не уменьшается на 1

если написать в скрипте
===================================
set S=3
set /a S-=1
echo %S%
===================================
то функция работает.

Получается что функция set с параметром /a не работает в составе цикла for

если нет решения этой задачи, то как ее решить???

ferget
28-06-2011, 02:54
есть такое:
оставить три последних по дате файла и удалить остальное


for /f "skip=3 delims=" %%a in ('dir/b/a-d/o-d *.7z') do del "%%a"

amel27
28-06-2011, 03:29
функция set с параметром /a не работает в составе цикла for »set работает, подстановка %S% не работает, см. "HELP SET"
SetLocal EnableDelayedExpansion

set/a S=3
for /f "delims=" %%i in ('dir/b/o:n *.7z') do (
set/a S-=1
if !S! LEQ 0 DEL %%i
)

ferget
28-06-2011, 03:58
остаются только 2 файла

mark23
28-06-2011, 07:01
ferget
изменил команду на: for /f "skip=3 delims=" %%a in ('dir /b /o:n *.7z') do del "%%a"
результат: удалил оставил только три последних файла и удалил остальные

amel27 вы все правильно написали, надо только изменить оператор сравнения в команде IF на LSS

если нет возражений то отмечу - решение данной темы найдено.

dimon91
04-04-2013, 12:26
Здравствуйте. Возникла такая же проблема, как и у автора темы. Есть скрипт для экспорта веток реестра из списка:

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A NUM=100
FOR /F "TOKENS=1 DELIMS=" %%I IN (LIST.TXT) DO (
REG EXPORT %%I .\%NUM%.REG
SET /A NUM+=1
ECHO %NUM%)
SET /A NUM+=1
ECHO %NUM%
PAUSE

Так вот, в цикле переменная num остается без изменений, однако вне цикла она принимает итоговое значение, которое и должно быть (если в списке например 65 строк, то результатом будет 166)

gora
04-04-2013, 16:09
Возникла такая же проблема, как и у автора темы »
Решение в посте 3. :read:

Iska
04-04-2013, 17:16
@echo off
setlocal enableextensions enabledelayedexpansion

set /a num = 100

for /f "tokens=1 delims=" %%i in (list.txt) do (
reg.exe export %%i .\!num!.reg
set /a num += 1
echo !num!
)

set /a num += 1
echo %num%

pause




© OSzone.net 2001-2012