Решение zmbq хорошо, но его нельзя использовать во всех ситуациях, например, внутри блока кода, такого как цикл FOR DO (...).
Альтернативой является использование индикаторной переменной.Инициализируйте его как неопределенное, а затем определяйте его, только если выполняется одно из условий ИЛИ.Затем используйте IF DEFINED в качестве финального теста - нет необходимости использовать отложенное расширение.
FOR ..... DO (
set "TRUE="
IF cond1 set TRUE=1
IF cond2 set TRUE=1
IF defined TRUE (
...
) else (
...
)
)
Вы можете добавить логику ELSE IF, которую использует arasmussen, на том основании, что она может выполнить крошечное быстрее, если выполнено 1-е условиеэто правда, но я никогда не беспокоюсь.
Приложение - Это дублирующий вопрос с почти идентичными ответами на Использование ИЛИ в операторе IF WinXP BatchСценарий
Заключительное приложение - Я почти забыл свой любимый метод проверки, является ли переменная одним из списка значений.Инициализируйте тестовую переменную, содержащую список допустимых значений с разделителями, а затем используйте поиск и замену, чтобы проверить, находится ли ваша переменная в списке.Это очень быстро и использует минимальный код для произвольно длинного списка.Требуется отложенное расширение (или трюк CALL %% VAR %%).Кроме того, тест НЕ УКАЗАН.
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)
Выше может произойти сбой, если VAR содержит =
, поэтому тест не защищен от ошибок.
Если выполняется тест в блоке, гдеотложенное расширение необходимо для доступа к текущему значению VAR, тогда
for ... do (
set "TEST=;val1;val2;val3;val4;val5;"
for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)
FOR могут потребоваться такие параметры, как "delims =", в зависимости от ожидаемых значений в VAR
. Приведенную выше стратегию можно сделать надежной дажес =
в VAR, добавив немного больше кода.
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true
Но теперь мы потеряли возможность предоставлять предложение ELSE, если мы не добавим переменную-индикатор.Код начал выглядеть немного «некрасиво», но я думаю, что это самый эффективный и надежный метод для тестирования, если VAR является любым из произвольного числа вариантов без учета регистра.
Наконец, есть более простойВерсия, которую я считаю, немного медленнее, потому что она должна выполнять один IF для каждого значения.Aacini предоставил это решение в комментарии к принятому ответу в вышеупомянутой ссылке
for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A do echo true
Список значений не может включать * или?символы, а значения и %VAR%
не должны содержать кавычек.Кавычки приводят к проблемам, если %VAR%
также содержит пробелы или специальные символы, такие как ^
, &
и т. Д. Еще одно ограничение этого решения состоит в том, что он не предоставляет опцию для предложения ELSE, если вы не добавите переменную-индикатор.Преимущества в том, что он может быть чувствительным к регистру или нечувствительным в зависимости от наличия или отсутствия опции IF /I
.