Operadores lógicos (“e”, “ou”) no lote do DOS

Como você implementaria operadores lógicos em arquivos em lotes do DOS?

    Você pode fazer and com condições aninhadas:

     if %age% geq 2 ( if %age% leq 12 ( set class=child ) ) 

    ou:

     if %age% geq 2 if %age% leq 12 set class=child 

    Você pode fazer or com uma variável separada:

     set res=F if %hour% leq 6 set res=T if %hour% geq 22 set res=T if "%res%"=="T" ( set state=asleep ) 

    A instrução IF não suporta operadores lógicos ( AND e OR ), instruções IF cascata fazem uma conjunit implícita.

     IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL 

    Se File1.Dat e File1.Dat existir, pule o label FILE12_EXIST_LABEL .

    Veja também: IF /?

    As leis de De Morgan nos permitem converter disjunções (“OR”) em equivalentes lógicos usando apenas conjunções (“AND”) e negações (“NOT”). Isso significa que podemos ligar disjunções (“OR”) em uma linha.

    Isto significa que se o nome é “Yakko” ou “Wakko” ou “Dot”, então ecoar “Warner irmão ou irmã”.

     set warner=true if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false if "%warner%"=="true" echo Warner brother or sister 

    Esta é outra versão do exemplo “OR” do paxdiablo, mas as condições são encadeadas em uma linha. (Note que o oposto de leq é gtr e o oposto de geq é lss .)

     set res=true if %hour% gtr 6 if %hour% lss 22 set res=false if "%res%"=="true" set state=asleep 

    Os exemplos a seguir mostram como criar uma instrução AND (usada para definir variables ​​ou include parâmetros para um comando).

    Para fechar a janela do CMD e iniciar o Bloco de notas:

     exit & start notepad.exe 

    Para definir as variables ​​x, y e z para valores, se a variável ‘a’ for igual a blah.

     if %a% equ blah set x=1 & set y=2 & set z=3 

    Espero que ajude!

    Também coberto em
    “120} Como eu uso os operadores AND / OR / XOR / NOT em uma instrução IF?”
    http://www.netikka.net/tsneti/info/tscmd120.htm

    OU é um pouco complicado, mas não excessivamente. Aqui está um exemplo

     set var1=%~1 set var2=%~2 :: set or_= if "%var1%"=="Stack" set or_=true if "%var2%"=="Overflow" set or_=true if defined or_ echo Stack OR Overflow 

    Uma alternativa é procurar um shell unix que forneça operadores lógicos e muito mais. Você pode obter uma implementação nativa do win32 de uma shell Bourne aqui se não quiser seguir a rota do cygwin. Uma festança nativa pode ser encontrada aqui . Tenho certeza que você poderia facilmente google outras boas alternativas, como zsh ou tcsh.

    K

    Experimente o operando de negação – ‘not’!

    Bem, se você pode executar a operação ‘AND’ em uma instrução if usando ‘if’ nested (consulte as respostas anteriores), então você pode fazer a mesma coisa com ‘if not’ para executar uma ‘ou’ operação.

    Se você ainda não entendeu a ideia, continue lendo. Caso contrário, apenas não perca seu tempo e volte a programar.

    Da mesma forma que ‘if’ nesteds são satisfeitos apenas quando todas as condições são verdadeiras, aninhadas ‘se não forem satisfeitas apenas quando todas as condições são falsas. Isso é semelhante ao que você quer fazer com um operando ‘ou’, não é?

    Mesmo quando qualquer uma das condições no nested ‘se não for verdadeira, a instrução inteira permanece não satisfeita. Assim, você pode usar negado ‘se em sucessão, lembrando que o corpo da declaração de condição deve ser o que você quer fazer se todas as condições aninhadas forem falsas. O corpo que você realmente queria dar deve vir sob a declaração else.

    E se você ainda não entendeu a coisa, desculpe, eu tenho 16 anos e isso é o melhor que posso fazer para explicar.

    Athul Prakash (16 anos na época) deu uma ideia lógica de como implementar um teste OR negando as condições em instruções IF e, em seguida, usando a cláusula ELSE como o local para colocar o código que requer execução. Eu pensei comigo mesmo que existem duas outras cláusulas normalmente necessárias, já que ele está sugerindo o uso de duas instruções IF, e assim o código executado precisa ser escrito duas vezes . No entanto, se um GOTO for usado para ignorar o código requerido, em vez de escrever cláusulas ELSE, o código para execução precisará ser gravado apenas uma vez .

    Aqui está um exemplo testável de como eu implementaria a lógica negativa de Athul Prakash para criar um OR .

    No meu exemplo, alguém tem permissão para dirigir um tanque se tiver uma licença de tanque ou eles estão fazendo seu serviço militar . Digite true ou false nos dois prompts e você poderá ver se a lógica permite que você dirija um tanque.

     @ECHO OFF @SET /p tanklicence=tanklicence: @SET /p militaryservice=militaryservice: IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice% :done PAUSE 

    É tão fácil quanto o seguinte:

    E> se + se

     if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something* 

    OU> se // se

     set BOTH=0 if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1 if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something* if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something* 

    Eu sei que existem outras respostas, mas acho que a minha é mais simples, mais fácil de entender. Espero que isso ajude você! 😉

    Se você tiver interesse em escrever um if + AND / OR em uma declaração, então não há nada disso. Mas você ainda pode agrupar if com && / || e ( / ) instruções para alcançar o que você quer em uma linha sem quaisquer variables ​​adicionais e sem duplicação de bloco if-else (comando single echo para seções de código TRUE e FALSE ):

     @echo off setlocal set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR exit /b 0 :IF_OR ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+ exit /b 0 :IF_AND ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE- exit /b 0 

    Saída :

     TRUE+ FALSE- FALSE- FALSE- TRUE+ TRUE+ TRUE+ FALSE- 

    O truque está no comando type que descarta / define o nível de errorlevel e, portanto, manipula o caminho para o próximo comando.

    Ligeira modificação na resposta de Andry, reduzindo os comandos de tipo duplicados:

     set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR goto :eof :IF_OR (if /i not %A% EQU 1 ( if /i not %B% EQU 2 ( echo FALSE- type 2>nul ) )) && echo TRUE+ goto :eof :IF_AND (if /i %A% EQU 1 ( if /i %B% EQU 2 ( echo TRUE+ type 2>nul ) )) && echo FALSE- goto :eof