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