ループカウンターが機能しない

ループカウンターが機能しない
@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

私がやりたいのは、最初の英語のオーディオを default=yes に設定し、最初の英語の字幕も default=yes に設定することです。

上記のスクリプトを使用すると、最初の eng/audio を default=yes にすることができますが、eng/subtitle に同じことをしようとすると、動作が中断されます。最初の eng/subtitle の後のすべてのトラックは、default=no に設定する必要があるのに、default=yes として設定されます。

助けが要る。

ありがとう。

答え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 . . .

^^^^^^^^^ すべてOKです

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 という echo ステートメントを配置しました。その後、実行されない理由がわかり、修正しました。その後、その echo は不要になりましたが、デバッグ方法のアイデアが得られるように、REM で削除してそのまま残しました。

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

関連情報