Le compteur de boucle ne fonctionne pas

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

Résultat:

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

Ce que je veux faire est de faire en sorte que le premier eng audio soit paramétré par défaut = oui, mais également que le sous-titrage eng soit par défaut = yes.

En utilisant le script ci-dessus, je peux faire d'abord eng / audio default = yes, mais quand je vais faire la même chose pour eng / subtitle, ça casse. Chaque piste après le premier sous-titre est définie comme valeur par défaut = oui, alors qu'elle devrait l'être par défaut = non.

Besoin d'aide.

Merci.

Hbelouf
la source
-1 vous devriez résoudre ce problème et essayer de comprendre de quoi il s'agit. Vous devriez éventuellement en arriver à un simple problème. Essayer de démontrer qu'un problème de compteur de boucle ne fonctionne pas ne nécessite pas de référence à 'Encoded.mkv'
barlop
Et si je le fais, for /r %a in (a.a) do echo %aje reçois un message d'erreur, car (a.b) was unexpected at this time. il s'agit d'un répertoire et non d'un fichier. Alors, vous pourriez peut-être préciser comment votre ligne For /r %%A in (*Encoded.mkv) do (est censée fonctionner,
barlop
La boucle externe ne devrait pas être là, mettre à jour le code.
hbelouf
Pouvez-vous être beaucoup plus clair en collant les résultats souhaités et en les comparant aux résultats obtenus? Ne vous contentez pas de décrire, car votre anglais est pauvre. Vous avez collé les résultats que vous obtenez, c'est bien. Mais collez également les résultats souhaités. Essayez également d'expliquer en anglais ce que «défaut» est censé représenter. IF !eng_aud_count!==1IF !eng_aud_count!>=1
Voir
Aussi, vous écrivez "Chaque piste après le premier eng / subtitle est définie comme étant default = yes alors qu'elle devrait l'être avec default = no" Ce n'est pas vrai même dans vos propres résultats. La dernière ligne de vos résultats est 22---eng--- Subtitle---no--2et vous ne savez pas si vous voulez que ce soit oui ou non. Aussi, je vous suggère d'écrire un organigramme pour vous aider à comprendre votre code.
barlop

Réponses:

1

Je peux voir pourquoi. Mais j'aimerais que vous voyiez comment vous pouvez voir pourquoi.

J'ai créé un fichier avec des lignes comme

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

Cela reflète essentiellement votre fichier %% B est la piste %% C est lang %% D est le type

Au départ, je ne savais pas trop pourquoi le programme n'allait pas. Mais ensuite j'ai ajouté ces lignes-

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

Vous devriez maintenant voir ce que fait votre programme et pourquoi il fonctionne pour l’audio et non pour le sous-titre.

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

^^^^^^^^^ TOUT CE QUI EST OK

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

^^^^ C'EST BON

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

^^^^^^^ T IL EST LE PROBLEME voir la esb est fausse du point de vue de la logique de votre programme. Et continuez à appuyer sur n’importe quelle touche pour continuer. Esb est égal à 1. Dans la logique de votre programme, esb = 1 (nombre de sous-titres anglais == 1) signifie que vous êtes au premier rang et que vous souhaitez que default = yes pour le premier et uniquement le premier. un. Mais bien sûr, esb ne va pas refléter cela. Parce que quand vous frapperez les sous-titres plus tard, français, espagnol, peu importe, votre compte sera toujours égal à 1.

Toute la logique de votre programme doit être repensée, car ce n'est pas sur le nombre que vous voulez le faire, ni simplement sur le nombre. Ce doit être a) quand il frappe le premier sous-titre / audio b) la première fois qu'il le frappe

J'ai ajouté 2 nouvelles variables. eng_aud_flag et eng_sub_flag

Il y a une foule de déclarations faisant écho à des choses que j'avais l'habitude de trouver pour corriger les erreurs que j'ai commises lors de la réécriture de la logique du programme. J'ai laissé ces déclarations là REMd out, de sorte que vous avez une idée de la façon de déboguer

À un moment donné, je me suis demandé pourquoi certains codes n'étaient pas exécutés. J'ai donc placé une déclaration d'écho indiquant GOT HERE, puis j'ai découvert pourquoi il ne s'exécutait pas et je l'ai corrigé. Je n'ai alors plus besoin de cet écho, mais je l'ai laissé là. Vous avez donc une idée de la façon de déboguer les choses.

@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>
barlop
la source
Merci pour l'aide. Cela marche. J'ai travaillé sur le script batch plus avant, une chose étant que je devais imbriquer davantage les instructions if. J'ai pu supprimer les variables supplémentaires que vous avez ajoutées et toujours obtenir le résultat que je voulais. Je sais à quel point les programmeurs aiment les "déclarations de" dans les exigences, car elles n’illustrent pas ce que les clients veulent réellement. :)
hbelouf