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

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

alpap 22-02-2017 22:06 2714160

запустить счетчик по условию (команде)
 
Допустим такой вариант:

Код:

@echo off
set [=
for %%a in (a b c d e f d h i) do call :# "%%a"
pause
 
:#
 set/a m+=1
 if "%~1"=="d" if not defined [ set [=]& echo Запуск set/a n+=1
 echo %n% %m%
exit /b

надо запустить в этой же итерации еще один счетчик с отставанием по-отношению к первому (он должен запускаться итерацией) или (на крайний случай - не желательно) срыв по определенной (той же) команде. Первый счетчик работает весь шаг на увеличение, его трогать нельзя, использовать можно. Условие (может быть несколько соответствий) должно пропустить только первую выборку (в примере d повторяется) и запуск счетчика должен произойти единожды и далее работать на увеличение уже независимо.

Требуется примерно:

счет по команде
...................: a b c d e f d h i
set/a m+=1: 1 2 3 4 5 6 7 8 9
set/a n+=1 : 0 0 0 1 2 3 4 5 6

или прерывание по команде
...................: a b c d e f d h i
set/a m+=1: 1 2 3 4 5 6 7 8 9
set/a n+=1 : 1 2 3 0 1 2 3 4 5

идет счет (допустим имен файлов) на увеличение
1 2 3 4 5 6 7 8 9
на каком-то этапе счета наступает условие (нашли нужное имя (а может после него и еще такое же быть)) и по его однократному выполнению, не прекращая основного счета, начинается новый счет
основной 1 2 3 4 5 6
....новый 0 0 1 2 3 4
до начала нового счета необязательно нули, может быть ничего или единицы, но не более
не обязательно два счетчика, если это сделает один, как-то хитро узнавая сколько надо отнимать и выдавать разницу (вывод отдельной переменной)
1 2 3 4 5 6 7 8 9
(отнимаем 5 с нужного места, а именно после 5ти - произошло условие в это время)
0 0 0 0 0 1 2 3 4
но как это сделать?

Iska 22-02-2017 22:59 2714172

Я что-то не пойму, в чём проблема. Вроде ж всё должно работать, не?
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set /a iCountTotal = 0
set /a iCountAdd  = 0
set /a iCountReset = 0

for %%i in (a b c d e f d h i) do call :Sub "%%~i"

endlocal
exit /b 0
 
:Sub
        set /a iCountTotal += 1

        if /i "%~1" equ "d" (
                set /a iCountAdd += 1
                set /a iCountReset = 0
        ) else (
                set /a iCountReset += 1
        )

        echo [%~1] [%iCountTotal%] [%iCountAdd%] [%iCountReset%]

        exit /b

Цитата:

Код:

[a] [1] [0] [1]
[b] [2] [0] [2]
[c] [3] [0] [3]
[d] [4] [1] [0]
[e] [5] [1] [1]
[f] [6] [1] [2]
[d] [7] [2] [0]
[h] [8] [2] [1]
[i] [9] [2] [2]



alpap 23-02-2017 01:17 2714185

Iska,
надо вот так
Код:

[a] [1] [0] [1]
[b] [2] [0] [2]
[c] [3] [0] [3]
[d] [4] [1] [0]
[e] [5] [2] [1]
[f] [6] [3] [2]
[d] [7] [4] [3]
[h] [8] [5] [4]
[i] [9] [6] [5]

почему-то когда добавляю второе условие (нужна сработка один раз, только по первой "d")
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set /a iCountTotal = 0
set /a iCountAdd  = 0
set /a iCountReset = 0
set s=

for %%i in (a b c d e f d h i) do call :Sub "%%~i"

endlocal
pause& exit
 
:Sub
        set /a iCountTotal += 1

        if /i "%~1" equ "d" if not defined s (
                set s=true
                set /a iCountAdd += 1
                set /a iCountReset = 0
        ) else (
                set /a iCountReset += 1
        )

        echo [%~1] [%iCountTotal%] [%iCountAdd%] [%iCountReset%]>>"file.txt"

        exit /b

вывод вообще портится
Код:

[a] [1] [0] [0]
[b] [2] [0] [0]
[c] [3] [0] [0]
[d] [4] [1] [0]
[e] [5] [1] [0]
[f] [6] [1] [0]
[d] [7] [1] [1]
[h] [8] [1] [1]
[i] [9] [1] [1]

в идеале достаточно этого
Код:

[a] [1] [0]
[b] [2] [0]
[c] [3] [0]
[d] [4] [1]
[e] [5] [2]
[f] [6] [3]
[d] [7] [4]
[h] [8] [5]
[i] [9] [6]


Iska 23-02-2017 02:50 2714188

Цитата:

Цитата alpap
надо вот так »

Кажись, начал понимать. По условию однократно запускается начало отсчёта. Можно попробовать так:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set /a iCountTotal = 0
rem set /a iCountAdd  = 0
set /a iCountReset = 0

for %%i in (a b c d e f d h i) do call :Sub "%%~i"

endlocal
exit /b 0
 
:Sub
        set /a iCountTotal += 1

        if /i "%~1" equ "d" (
                set /a iCountReset = 0
                if not defined iCountAdd set /a iCountAdd = 0
        ) else (
                set /a iCountReset += 1
        )

        if defined iCountAdd set /a iCountAdd += 1

        echo [%~1] [%iCountTotal%] [%iCountAdd%] [%iCountReset%]

        exit /b

Цитата:

Код:

[a] [1] [] [1]
[b] [2] [] [2]
[c] [3] [] [3]
[d] [4] [1] [0]
[e] [5] [2] [1]
[f] [6] [3] [2]
[d] [7] [4] [0]
[h] [8] [5] [1]
[i] [9] [6] [2]



— если Вас устроит пустота в выводе. Если нет — потребуется ещё одна булева переменная, отвечающая за начало отсчёта, например, так:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set /a iCountTotal = 0
set /a iCountAdd  = 0
set /a iCountReset = 0
set /a boolStartCount = 0

for %%i in (a b c d e f d h i) do call :Sub "%%~i"

endlocal
exit /b 0
 
:Sub
        set /a iCountTotal += 1

        if /i "%~1" equ "d" (
                set /a iCountReset = 0
                set /a boolStartCount = 1
        ) else (
                set /a iCountReset += 1
        )

        if %boolStartCount% equ 1 set /a iCountAdd += 1

        echo [%~1] [%iCountTotal%] [%iCountAdd%] [%iCountReset%]

        exit /b

Цитата:

Код:

[a] [1] [0] [1]
[b] [2] [0] [2]
[c] [3] [0] [3]
[d] [4] [1] [0]
[e] [5] [2] [1]
[f] [6] [3] [2]
[d] [7] [4] [0]
[h] [8] [5] [1]
[i] [9] [6] [2]




Но мне непонятен Ваш третий столбец. Почему у Вас здесь:
Код:

[d] [7] [4] [3]
в примере, как должно быть, при втором появлении d, не происходит оговоренного сброса третьего счётчика?!

alpap 23-02-2017 03:56 2714193

Iska,
Вот Спасибо!
Первый код под спойлером именно то что нужно, а то я уже начал думать что это нереально.

мне этого достаточно для дальнейших своих действий:
Код:

@echo off
setlocal
 set/a m=0
 for %%a in (a b c d e f d h i) do call :# "%%a"
endlocal
pause& exit
 
:#
 set/a m+=1
 if "%~1"=="d" if not defined n set/a n=0
 if defined n set/a n+=1
 echo %m% %n%
exit /b



Время: 19:57.

Время: 19:57.
© OSzone.net 2001-