Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Не работает команда set /a (http://forum.oszone.net/showthread.php?t=210000)

mark23 27-06-2011 23:07 1702619

Не работает команда set /a
 
здравствуйте, прошу Вас помочь в решении одной задачи.

в определенном каталоге находятся архивы, которые именуются по дате их создания, пример названия таких файлов:
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 1702698

есть такое:
оставить три последних по дате файла и удалить остальное

Код:

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

amel27 28-06-2011 03:29 1702703

Цитата:

Цитата mark23
функция 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 1702705

остаются только 2 файла

mark23 28-06-2011 07:01 1702723

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 2125560

Здравствуйте. Возникла такая же проблема, как и у автора темы. Есть скрипт для экспорта веток реестра из списка:
читать дальше »

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 2125664

Цитата:

Цитата dimon91
Возникла такая же проблема, как и у автора темы »

Решение в посте 3. :read:

Iska 04-04-2013 17:16 2125709

Код:

@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



Время: 05:53.

Время: 05:53.
© OSzone.net 2001-