Войти

Показать полную графическую версию : [решено] запустить счетчик по условию (команде)


alpap
22-02-2017, 22:06
Допустим такой вариант:


@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
Я что-то не пойму, в чём проблема. Вроде ж всё должно работать, не?
@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
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
надо вот так »
Кажись, начал понимать. По условию однократно запускается начало отсчёта. Можно попробовать так:
@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
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




© OSzone.net 2001-2012