루프 카운터가 작동하지 않음

루프 카운터가 작동하지 않음
@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

내가 하고 싶은 것은 첫 번째 eng 오디오를 default=yes로 만들고 첫 번째 eng 자막도 default=yes로 만드는 것입니다.

위의 스크립트를 사용하여 첫 번째 eng/audio를 default=yes로 설정할 수 있지만 eng/subtitle에 대해 동일한 작업을 수행하면 중단됩니다. 첫 번째 영어/자막 이후의 모든 트랙은 default=no로 설정되어야 하는데 default=yes로 설정됩니다.

도움이 필요해.

감사해요.

답변1

이유를 알 수 있습니다. 하지만 그 이유를 어떻게 알 수 있는지 확인하고 싶습니다.

나는 다음과 같은 줄로 파일을 만들었습니다.

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

이는 본질적으로 파일 %%B가 트랙 %%C는 lang %%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에 해당 명령문을 남겨 두었으므로 디버깅 방법에 대한 아이디어를 얻을 수 있습니다.

어느 순간 일부 코드가 왜 실행되지 않는지 궁금해서 거기에 GOT HERE라는 ​​에코 문을 넣은 다음 왜 실행되지 않는지 알아내고 수정했습니다. 그러면 더 이상 해당 에코가 필요하지 않지만 디버깅 방법을 알 수 있도록 REMd에 그대로 두었습니다.

@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>

관련 정보