Пакетные файлы Windows: несколько условий - PullRequest
24 голосов
/ 19 мая 2011

Есть ли способ сказать что-то вроде

if %1 == 1 or %1 == 2

в командном файле? Или даже лучше, если бы я мог указать набор значений-кандидатов, таких как

if %1 in [1, 2, 3, 4, ... 20]

Ответы [ 4 ]

25 голосов
/ 26 февраля 2013

«И» оказывается легким - только не тот синтаксис, который вы ожидаете: Эти 3 примера иллюстрируют это.

В словах: если 1 == 1 И 2 ​​== 2, то эхо "привет"

if 1==1 echo hello
hello

if 1==1 if 2==2 echo hello
hello

if 1==1 if 2==1 echo hello
(nothing was echoed)
23 голосов
/ 19 мая 2011

Одним из способов реализации логического or является использование нескольких условных обозначений, которые goto имеют одинаковую метку.

if %1 == 1 goto :cond
if %1 == 2 goto :cond
goto :skip
:cond
someCommand
:skip

Чтобы проверить членство в наборе, вы можете использовать цикл for:

for %%i in (1 2 3 4 ... 20) do if %1 == %%i someCommand

Обратите внимание, что == является оператором равенства строк. equ является оператором числового равенства.

9 голосов
/ 08 ноября 2012

Я знаю, что это старо, но я просто хотел, чтобы вы знали, что это действительно возможно, в отличие от предыдущих сообщений. По сути, вы связываете две команды IF в одну.

Синтаксис: IF equation (cmd if true)else command if false

Попробуйте это для двух переменных (для выполнения оператора IF xx AND xx)

set varone=1
set vartwo=2

if %varone% equ 1 (if %vartwo% equ 2 (echo TRUE)else echo FALSE)else echo FALSE

с одной переменной (для выполнения оператора ИЛИ, обратите внимание, вы также можете использовать более одной переменной)

if %a% equ 1 (echo pass)else if %a equ 2 (echo pass)else echo false

Вы можете заменить проход / сбой Echo своей командой

0 голосов
/ 27 ноября 2013

Немного опоздал в игре, но, тем не менее, предполагал, может ли это помочь кому-нибудь наткнуться на вопрос. Для этого я использую комбинацию эхо-канала для findstr, вот так:

(echo ":1: :2:" | findstr /i ":%1:" 1>nul 2>nul) && (
    echo Input is either 1 or 2
)

Поскольку findstr - это внешняя команда, я рекомендую не использовать ее внутри цикла, который может проходить тысячи итераций. Если это не так, это должно решить, что вы пытаетесь сделать, вместо использования нескольких if. Кроме того, нет ничего особенного в выборе «:», просто используйте разделитель, который вряд ли будет частью значения в% 1.

Благодаря остальным людям, указавшим на другую ссылку, у которой, похоже, есть похожий вопрос, я также опубликую этот ответ там, на тот случай, если кто-то наткнется на этот вопрос и не дойдет до него.

...