The batch language is equipped with a full set of boolean logic operators like AND, OR, XOR, but *only for binary numbers*, not for conditions.

Neither are there any values for TRUE or FALSE.

The only logical operator available for conditions is the NOT operator.

This page will teach you how to emulate the missing logical operators.

To test if a condition is true, IF is used:

IF EXISTfilename... IF %value% LSS 10 ... IF /I NOT "%string1%"=="string2" ... IF NOT ERRORLEVEL 1 ...

Unfortunately, there is no such thing as `IF %1 LSS 10 AND %2 GTR 0 ...`

so we'll have to emulate the missing operators.

The AND operator is the easiest one to emulate: we can just "nest" `IF`

statements.

IF %1 LSS 10 ( IF %2 GTR 0 ( ECHO %%1 is less than 10 AND %%2 is greater than 0 ) )

or:

IF %1 LSS 10 (IF %2 GTR 0 (ECHO %%1 is less than 10 AND %%2 is greater than 0))

or:

IF %1 LSS 10 IF %2 GTR 0 ECHO %%1 is less than 10 AND %%2 is greater than 0

Even though the three code snippets are identical, we will use the first one for better readability, especially when the equation becomes more complex.

An example: if `%1`

must be less than 10 AND `%2`

must be greater than 0, and we want to include an `ELSE`

statement in case these conditions are not both true, the need for parenthesis becomes obvious.

Consider these two code snippets:

IF %1 LSS 10 ( IF %2 GTR 0 ( ECHO %1 is less than 10 AND %2 is greater than 0 ) ) ELSE ( ECHO %1 is NOT less than 10 )

and

IF %1 LSS 10 ( IF %2 GTR 0 ( ECHO %1 is less than 10 AND %2 is greater than 0 ) ELSE ( ECHO %1 is NOT less than 10 OR %2 is NOT greater than 0 ) )

The placement of the `ELSE`

statement is critical!

The code snippet above still does not cover the case when `%1`

is greater than or equal to 10.

To complete it, we would need:

IF %1 LSS 10 ( IF %2 GTR 0 ( ECHO %1 is less than 10 AND %2 is greater than 0 ) ELSE ( ECHO %1 is NOT less than 10 OR %2 is NOT greater than 0 ) ) ELSE ( ECHO %1 is NOT less than 10 OR %2 is NOT greater than 0 )

Unlike the simple basic example, to convert these code snippets to one-liners again is impossible without parenthesis.

You may often be tempted to remove some parenthesis, but this may change the logic of the equation.

Often the OR operator can be replaced by AND and NOT operaters: if condition 1 OR condition 2 must be true, you may also say that NOT condition 1 AND NOT condition must be false.

An example: we want to replace the AND operator in the previous example by the OR operator, i.e. `%1`

must be less than 10 OR `%2`

must be greater than 0.

For numerical comparisons we don't need `NOT`

but we can replace `LSS`

by `GEQ`

etcetera.

We might try:

IF %1 GEQ 10 ( IF %2 LEQ 0 ( ECHO %1 is NOT less than 10 OR %2 is NOT greater than 0 ) ELSE ( ECHO %1 is less than 10 OR %2 is greater than 0 ) ) ELSE ( ECHO %1 is less than 10 OR %2 is greater than 0 )

Though possible, emulating the XOR operator with the techniques described before would require far too complex code snippets, a debugger's nightmare.

There are two alternative techniques:

- use temporary variables for the result
- use temporary variables per condition, combined with binary math

This technique is perfect for both the AND and the OR operator.

OR:

SET Result=0 IF %1 LSS 10 SET Result=1 IF %2 GTR 0 SET Result=1 IF %Result% EQU 1 ( ECHO %1 is less than 10 OR %2 is greater than 0 ) ELSE ( ECHO %1 is NOT less than 10 AND %2 is NOT greater than 0 )

AND:

SET Result=1 IF NOT %1 LSS 10 SET Result=0 IF NOT %2 GTR 0 SET Result=0 IF %Result% EQU 1 ( ECHO %1 is less than 10 AND %2 is greater than 0 ) ELSE ( ECHO %1 is NOT less than 10 OR %2 is NOT greater than 0 )

Note: | In the example above, `IF NOT %1 LSS 10 ...` is used to explain the technique.In real life, you would probably use `IF %1 GEQ 10 ...` |

Consider using 4 conditions, and compare the complexity of the techniques described so far.

To emulate XOR for 2 conditions you can use `SET Result += 1`

and `IF %Result% EQU 1`

instead.

For this technique, use a (binary) variable for each condition:

IF %1 LSS 10 (SET Cond1=1) ELSE (SET Cond1=0) IF %2 GTR 0 (SET Cond2=1) ELSE (SET Cond2=0)

Next, use binary math to get the results:

SET /A "ResultAND = %Cond1% & %Cond2%" IF %ResultAND% EQU 1 (ECHO AND: TRUE) ELSE (ECHO AND: FALSE) SET /A "ResultOR = %Cond1% | %Cond2%" IF %ResultOR% EQU 1 (ECHO OR: TRUE) ELSE (ECHO OR: FALSE) SET /A "ResultXOR = %Cond1% ˆ %Cond2%" IF %ResultXOR% EQU 1 (ECHO XOR: TRUE) ELSE (ECHO XOR: FALSE)

We have discussed techniques for binary logic in batch files.

Though there is a full set of operators available for binary *math*, they are lacking for logical conditions.

This page shows how to translate these conditions to 0 (FALSE) or 1 (TRUE) and use binary math to get the logical results.

- For simple
`AND`

statements (2 conditions) without`ELSE`

clause, use nested`IF`

statements. - In every other case, use temporary variables, and optionally binary math.

page last uploaded: 2015-08-24, 21:09 |