AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1643414
Accepted
bat_cmd
bat_cmd
Asked: 2021-04-21 20:08:13 +0800 CST2021-04-21 20:08:13 +0800 CST 2021-04-21 20:08:13 +0800 CST

Confuso sobre o rótulo goto (arquivo em lote) Windows

  • 772

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

windows batch
  • 3 3 respostas
  • 141 Views

3 respostas

  • Voted
  1. Best Answer
    Appleoddity
    2021-04-21T20:28:38+08:002021-04-21T20:28:38+08:00

    Seu arquivo de lote é executado de cima para baixo.

    No segundo exemplo, mesmo se foo2ou foo1estiver definido, sempre irá para :another_menu. A única maneira de o arquivo em lote passar dessas duas instruções é se ambos foo1e foo2estiverem 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:

    if not "%foo1%"=="bar1" if not "%foo2%"=="bar2" goto :another_menu
    

    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

    • 2
  2. T3RR0R
    2021-04-22T18:31:15+08:002021-04-22T18:31:15+08:00

    Sua lógica pode ser simplificada um pouco através do uso de findstr

     Echo("%foo%"|Findstr /C:"bar1" /C:"bar2" > nul && Goto :FooBarMenu || Goto :AnotherMenu
    
    

    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:

    @Echo off
     Set "foo=notbar"
    
    :loop
     Echo("%foo%"|Findstr /C:"bar1" /C:"bar2" > nul ^
     && Call :fooBarMenu foobarMenu || Call :AnotherMenu Anothermenu
     If not defined foo Exit /B 0
    Goto :loop
    
    :foobarmenu
     Echo(@ %~1 foo = %foo%
     Set "foo="
    Exit /B 0
    
    :Anothermenu
     Echo(@ %~1 foo = %foo%
     Set "foo=bar2"
    Exit /B 0
    
    • 1
  3. Stephan
    2021-04-23T01:11:39+08:002021-04-23T01:11:39+08:00

    Você já verificou bar1e bar2. Portanto, não há necessidade de verificar novamente se NÃO É bar1ou bar2(definitivamente não é quando o fluxo de código atinge esse ponto porque você já ramificou em outro lugar quando o fez).

    rem Check if foo was previously set as bar1 or bar2...
    if "%foo%"=="bar1" goto :foobar_menu
    if "%foo%"=="bar2" goto :foobar_menu
    rem no need to check if foo was NOT previously set as bar1 or bar2
    rem if FOO is anything other than the previously checked values, 
    rem your code will continue here anyway.
    echo FOO isn't bar1 or bar2.
    rem Don't forget to end this branch of your code or it will just continue to run:
    goto :eof
    :foobar_menu
    echo reached foobar.
    

    Você pode querer considerar usar a /iopção com ifpara ignorar a capitalização
    ( if "foo"=="FOO"é falso, if /i "foo"=="FOO"é verdadeiro)

    • 1

relate perguntas

  • renomear em massa conjuntos de arquivos de imagem

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Comunique-se com o daemon do Docker no Windows

  • atalho do shell da área de trabalho no painel lateral do explorer

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve