Se eu usar esses comandos dessa maneira, ele faz o que deveria:
Se foo
foi definido anteriormente como uma coisa ou outra, ele pula parafoobar_menu
Se foo
anteriormente não foi definido como (o mesmo) uma coisa ou outra, ele pula paraanother_menu
rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu
rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu
Eis por que está me confundindo - se eu trocá-los como mostrado abaixo, não funciona corretamente, vai para o rótulo errado, mas por quê?
rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu
rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu
Por que essas duas coisas não estão fazendo a mesma coisa?
Isso é porque não estou colocando as partes goto entre colchetes?
Eu o tenho funcionando (a primeira maneira), mas essa não é a mesma ordem em que meus menus entram e eu só queria que tudo funcionasse da maneira que está definido no segundo exemplo (não funcional) acima.
Felicidades.
EDITAR:
Estes são os comandos reais. Quando colocado dessa maneira, embora aninhado, ele ainda vai para o rótulo, choose_audio_sample_rate
mesmo que opus ou libopus esteja definido na variável.
if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate
if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus
Na verdade, a versão trocada também não funciona, também vai para choose_audio_sample_rate
mesmo que opus ou libopus esteja definido na variável.
if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus
if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate
Estou virando um lunático aqui lol, OK, vai funcionar (e passar direto para o menu não-opus) se eu usar apenas isso:
if "%audio_codec%"=="libopus" (goto :choose_audio_sample_rate_opus)
if "%audio_codec%"=="opus" (goto :choose_audio_sample_rate_opus)
Se for libopus, vai para o rótulo certo. Se não for libopus, a próxima linha é processada e se for opus, vai para o rótulo correto.
Se foi além disso, nem libopus nem opus e segue para o menu geral.
Seu arquivo de lote é executado de cima para baixo.
No segundo exemplo, mesmo se
foo2
oufoo1
estiver definido, sempre irá para:another_menu
. A única maneira de o arquivo em lote passar dessas duas instruções é se ambosfoo1
efoo2
estiverem definidos.Você está essencialmente criando uma situação lógica OR.
Se foo1 OR foo2 não estiver definido vá para outro_menu
SENÃO
Se foo1 OR foo2 estiver definido, vá para foobar_menu
SENÃO
Fazer nada
Considerando que o primeiro exemplo,
Se foo1 OR foo2 estiver definido, vá para foobar_menu
SENÃO
Se foo1 OR foo2 não estiver definido vá para outro_menu
SENÃO
Fazer nada
O que você precisa é especificamente um AND lógico. As instruções IF do arquivo em lote não suportam AND ou OR. Então, nós os aninhamos ou os encadeamos assim:
Isso diz: Se foo1 não estiver definido, se foo2 não estiver definido, vá para:another_menu
Ou, mais facilmente, se foo1 AND foo2 não estiverem definidos, vá para outro_menu
Sua lógica pode ser simplificada um pouco através do uso de findstr
A lógica: Findstr compara a string
%foo%
com bar1 e bar2. Se houver uma correspondência, o comando será concluído com êxito e o operador condicional&&
executará o comando a seguir. Se não houver correspondência,||
o operador condicional é acionado executando o comando a seguir, pois o comando anterior não foi executado com sucesso.Exemplo:
Você já verificou
bar1
ebar2
. Portanto, não há necessidade de verificar novamente se NÃO Ébar1
oubar2
(definitivamente não é quando o fluxo de código atinge esse ponto porque você já ramificou em outro lugar quando o fez).Você pode querer considerar usar a
/i
opção comif
para ignorar a capitalização(
if "foo"=="FOO"
é falso,if /i "foo"=="FOO"
é verdadeiro)