Счетчик циклов не работает

Счетчик циклов не работает
@echo off
setlocal enableextensions enabledelayedexpansion

set /a eng_aud_count=0
set /a eng_sub_count=0

For /f "tokens=1-9 usebackq delims=.:^)^( skip=2" %%A in ("MY text File") do ( 

set trck=%%B
set lang=%%C
set type=%%D

If "!type!"==" Audio" (
IF "!lang!"=="eng" (
set /a eng_aud_count+=1
)
)

If "!type!"==" Subtitle" (
IF "!lang!"=="eng" (
set /a eng_sub_count+=1
)
)

set default=no

If "!trck!"=="0" (set default=yes)

IF !eng_aud_count!==1 (set default=yes)
IF !eng_sub_count!==1 (set default=yes)

Echo !trck!---!lang!---!type!---!default!--!eng_sub_count!
)

Exit /b

Endlocal

Результат:

0---eng--- Video---yes--0
1---eng--- Audio---yes--0
2---eng--- Audio---no--0
3---spa--- Audio---no--0
4---fra--- Audio---no--0
5---deu--- Audio---no--0
6---por--- Audio---no--0
7---eng--- Audio---no--0
8---eng--- Subtitle---yes--1
9---spa--- Subtitle---yes--1
10---spa--- Subtitle---yes--1
11---fra--- Subtitle---yes--1
12---fra--- Subtitle---yes--1
13---dan--- Subtitle---yes--1
14---nld--- Subtitle---yes--1
15---fin--- Subtitle---yes--1
16---deu--- Subtitle---yes--1
17---deu--- Subtitle---yes--1
18---nor--- Subtitle---yes--1
19---por--- Subtitle---yes--1
20---por--- Subtitle---yes--1
21---swe--- Subtitle---yes--1
22---eng--- Subtitle---no--2

Я хочу сделать так, чтобы для первого английского звука было установлено значение по умолчанию = да, а также для первого английского субтитра — значение по умолчанию = да.

Используя скрипт выше, я могу сделать first eng/audio default=yes, но когда я пытаюсь сделать то же самое для eng/subtitle, он ломается. Каждый трек после first eng/subtitle устанавливается как default=yes, когда он должен быть установлен как default=no.

Нужна помощь.

Спасибо.

решение1

Я понимаю, почему. Но я хотел бы, чтобы вы увидели, как вы можете понять, почему.

Я создал файл со строками типа

g:0:eng:Video
g:1:eng: Audio

Это по сути отражает ваш файл %%B - это трек %%C - это язык %%D - это тип

Я изначально не был уверен, почему программа работает неправильно. Но потом я добавил эти строки-

echo eac=!eng_aud_count!
echo esb=!eng_sub_count!
pause

Теперь вы должны увидеть, что делает ваша программа и почему она работает для аудио, но не для субтитров.

C:\crp>a
0---eng---Video---yes--0
eac=0
esb=0
Press any key to continue . . .
1---eng--- Audio---yes--0
eac=1
esb=0
Press any key to continue . . .
2---eng--- Audio---no--0
eac=2
esb=0
Press any key to continue . . .
3---spa--- Audio---no--0
eac=2
esb=0
Press any key to continue . . .
4---fra--- Audio---no--0
eac=2
esb=0
Press any key to continue . . .
5---deu--- Audio---no--0
eac=2
esb=0
Press any key to continue . . .
6---por--- Audio---no--0
eac=2
esb=0
Press any key to continue . . .
7---eng--- Audio---no--0
eac=3
esb=0
Press any key to continue . . .

^^^^^^^^^^ ВСЕ В ПОРЯДКЕ

8---eng--- Subtitle---yes--1
eac=3
esb=1

^^^^ ЭТО ХОРОШО

Press any key to continue . . .
9---spa--- Subtitle---yes--1
eac=3
esb=1
Press any key to continue . . .

^^^^^^^^ ВОТ ПРОБЛЕМА, видите, что esb неверен с точки зрения логики вашей программы. И продолжайте нажимать любую клавишу, чтобы продолжить, видите, что esb равен 1. В логике вашей программы esb=1 (количество английских субтитров == 1) означает, что вы находитесь на первом, и вы хотите default=yes для первого и только первого. Но, конечно, esb не будет этого отражать. Потому что когда вы нажмете на последующие субтитры, французские, испанские, какие угодно, ваш счетчик все равно будет равен 1.

Вся логика вашей программы должна быть переосмыслена, потому что она не основана на количестве, которое вы хотите сделать, или не только на количестве. Это должно быть a) когда она попадает на первый субтитр/аудио b) когда она попадает на него в первый раз

Я добавил 2 новые переменные. eng_aud_flag и eng_sub_flag

Есть куча утверждений, которые повторяют то, что я использовал для поиска ошибок, которые я сделал, переписывая логику программы. Я оставил эти утверждения там REMd out, так что у вас есть представление о том, как отлаживать

В какой-то момент я задался вопросом, почему некоторый код не выполняется, поэтому я поместил туда оператор echo, говоря GOT HERE, а затем я выяснил, почему он не выполняется, и исправил это. После этого мне больше не нужно это echo, но я оставил его там REMd out, чтобы у вас было представление о том, как отлаживать вещи.

@echo off
setlocal enableextensions enabledelayedexpansion

set /a eng_aud_count=0
set /a eng_sub_count=0

set /a eng_aud_flag=false
set /a eng_sub_flag=false

For /f "tokens=1-9 usebackq delims=.:^)^( skip=2" %%A in ("a.a") do ( 

set trck=%%B
set lang=%%C
set type=%%D

set default=no


If "!type!"==" Audio" (
  IF "!lang!"=="eng" (
  set /a eng_aud_count+=1
  IF !eng_aud_count!==1 (
    set /a eng_aud_flag=true
    set default=yes
  )
 )
)

If "!type!"==" Subtitle" (
IF "!lang!"=="eng" (
set /a eng_sub_count+=1
REM echo here
REM echo eng_sub_count==!eng_sub_count!
 IF !eng_sub_count!==1 (
 REM echo GOOD
  set /a eng_sub_flag=true
  set default=yes
 REM  echo here2
 )
)
)



If "!trck!"=="0" (set default=yes)


Echo !trck!---!lang!---!type!---!default!--!eng_sub_count!



 REM echo eac=!eng_aud_count!
 REM echo esb=!eng_sub_count!
REM  echo def=!default!
REM echo subflag=!eng_sub_flag!
REM echo audflag=!eng_aud_flag!
REM  pause
)

Exit /b

Endlocal

C:\crp>type a.a


g:0:eng:Video
g:1:eng: Audio
g:2:eng: Audio
g:3:spa: Audio
g:4:fra: Audio
g:5:deu: Audio
g:6:por: Audio
g:7:eng: Audio
g:8:eng: Subtitle
g:9:spa: Subtitle
g:10:spa: Subtitle
g:11:fra: Subtitle
g:12:fra: Subtitle
g:13:dan: Subtitle
g:14:nld: Subtitle
g:15:fin: Subtitle
g:16:deu: Subtitle
g:17:deu: Subtitle
g:18:ryt: Subtitle
g:19:por: Subtitle
g:20:por: Subtitle
g:21:swe: Subtitle
g:22:eng: Subtitle


C:\crp>

C:\crp>a
0---eng---Video---yes--0
1---eng--- Audio---yes--0
2---eng--- Audio---no--0
3---spa--- Audio---no--0
4---fra--- Audio---no--0
5---deu--- Audio---no--0
6---por--- Audio---no--0
7---eng--- Audio---no--0
8---eng--- Subtitle---yes--1
9---spa--- Subtitle---no--1
10---spa--- Subtitle---no--1
11---fra--- Subtitle---no--1
12---fra--- Subtitle---no--1
13---dan--- Subtitle---no--1
14---nld--- Subtitle---no--1
15---fin--- Subtitle---no--1
16---deu--- Subtitle---no--1
17---deu--- Subtitle---no--1
18---ryt--- Subtitle---no--1
19---por--- Subtitle---no--1
20---por--- Subtitle---no--1
21---swe--- Subtitle---no--1
22---eng--- Subtitle---no--2

C:\crp>

Связанный контент