Есть ли способ написать условный оператор IF OR IF в пакетном файле Windows?
Например:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
windows
batch-file
if-statement
cmd
conditional
Mechaflash
источник
источник
IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE
. Я использовал , чтобы определить ,SET AND=IF
а затем написать:IF cond1 %AND% cond2 ECHO BOTH ARE TRUE
.Ответы:
Решение zmbq хорошее, но не может использоваться во всех ситуациях, например, внутри блока кода, такого как цикл FOR DO (...).
Альтернативой является использование индикаторной переменной. Инициализируйте его как неопределенное, а затем определите его, только если выполняется одно из условий ИЛИ. Затем используйте IF DEFINED в качестве финального теста - нет необходимости использовать отложенное расширение.
Вы можете добавить логику ELSE IF, которую использует arasmussen на том основании, что она может работать немного быстрее, если 1-е условие истинно, но я никогда не беспокоюсь.
Приложение - это повторяющийся вопрос с почти идентичными ответами на использование оператора ИЛИ в операторе IF. Пакетный сценарий WinXP.
Последнее добавление - я почти забыл свой любимый метод проверки, является ли переменная одним из списков нечувствительных к регистру значений. Инициализируйте тестовую переменную, содержащую список допустимых значений с разделителями, а затем используйте поиск и замену, чтобы проверить, находится ли ваша переменная в списке. Это очень быстро и требует минимального кода для произвольно длинного списка. Это требует отложенного расширения (или трюка CALL %% VAR %%). Также тест НЕ ЧУВСТВИТЕЛЬНЫЙ.
Вышеупомянутое может не пройти, если VAR содержит
=
, поэтому тест не является надежным.Если вы выполняете тест в блоке, где требуется отложенное расширение для доступа к текущему значению VAR, тогда
Параметры FOR, такие как "delims =", могут потребоваться в зависимости от ожидаемых значений в VAR.
Вышеупомянутую стратегию можно сделать надежной даже
=
в VAR, добавив немного больше кода.Но теперь мы потеряли возможность предоставлять предложение ELSE, если мы не добавим индикаторную переменную. Код начал выглядеть немного «некрасиво», но я думаю, что это наиболее эффективный и надежный метод проверки, является ли VAR одним из произвольного числа вариантов без учета регистра.
Наконец, есть более простая версия, которая, на мой взгляд, немного медленнее, потому что она должна выполнять один IF для каждого значения. Aacini предоставил это решение в комментарии к принятому ответу в ранее упомянутой ссылке
Список значений не может включать * или? символы, а значения и
%VAR%
не должны содержать кавычек. Цитаты приводят к проблемам, если они%VAR%
также содержат пробелы или специальные символы, например^
,&
и т. Д. Еще одно ограничение этого решения заключается в том, что оно не предоставляет возможность для предложения ELSE, если вы не добавите индикаторную переменную. Преимущества в том, что он может быть чувствительным к регистру или нечувствительным в зависимости от наличия или отсутствия/I
опции IF .источник
Я так не думаю. Просто используйте два IF и GOTO с той же меткой:
источник
ECHO Didn't find it
даже если он его нашел.Спасибо за этот пост, он мне очень помог.
Не знаю, может ли это помочь, но у меня возникла проблема, и благодаря вам я нашел, как мне кажется, еще один способ ее решения, основанный на этой логической эквивалентности:
«А или Б» - это то же самое, что «не (не А и не Б)»
Таким образом:
Становится:
источник
Простое «FOR» может использоваться в одной строке для использования условия «или»:
Применимо к вашему делу:
источник
Даже если этот вопрос немного старше:
Если хотите использовать
if cond1 or cond 2
- не используйте сложные циклы и тому подобное.Простое предоставление обоих
ifs
друг за другом в сочетании сgoto
неявным или.Без goto, но с действием «на месте», вы можете выполнить действие 3 раза, если ВСЕ условия совпадают.
источник
Однако в Batch нет
IF <arg> OR
илиELIF
илиELSE IF
...Попробуйте вложить другие IF в ELSE предыдущего IF.
источник
Можно использовать функцию, которая оценивает логику ИЛИ и возвращает одно значение.
источник
&& ... || ...
синтаксис напрямую вместо дополнительногоIF ... ELSE ...
оператора.Цель может быть достигнута за счет косвенного использования IF.
Ниже приведен пример сложного выражения, которое можно довольно кратко и логично записать в пакете CMD без несогласованных меток и GOTO.
Блоки кода между скобками () обрабатываются CMD как (жалкая) подоболочка. Независимо от того, какой код выхода выходит из блока, он будет использоваться для определения истинного / ложного значения, которое блок воспроизводит в более крупном логическом выражении. С помощью этих блоков кода можно построить произвольно большие логические выражения.
Простой пример
Каждый блок принимает значение true (т.е. ERRORLEVEL = 0 после того, как последний оператор в блоке был выполнен) / false, пока не будет определено значение всего выражения или управление не выйдет (например, через GOTO):
Сложный пример
Это решает изначально возникшую проблему. В каждом блоке возможно несколько операторов, но в || || || выражение желательно быть кратким, чтобы оно было как можно более читаемым. ^ - это escape-символ в пакетах CMD, и если его поместить в конец строки, он выйдет из EOL и проинструктирует CMD продолжить чтение текущего пакета операторов на следующей строке.
источник
Это для проверки того, равны ли значения нескольких переменных. Вот для любой переменной.
Я просто подумал об этом с головы до ног. Я мог бы сжать его больше.
источник
Я понимаю, что этот вопрос старый, но я хотел опубликовать альтернативное решение на случай, если кто-то еще (например, я) нашел эту ветку, имея тот же вопрос. Мне удалось обойти отсутствие оператора OR, повторив переменную и используя findstr для проверки.
источник
Хотя ответ dbenham довольно хорош, полагаясь на
IF DEFINED
него, вы можете столкнуться с множеством проблем, если проверяемая вами переменная не является средой. переменная переменной . Переменные скрипта не обрабатываются таким специальным образом.Хотя это может показаться нелепым недокументированным BS, выполнение простого запроса оболочки
IF
с помощьюIF /?
показывает, чтоЧто касается ответа на этот вопрос, есть ли причина не использовать простой флаг после серии оценок?
OR
Мне это кажется наиболее гибкой проверкой как в отношении базовой логики, так и в отношении читабельности. Например:Очевидно, это может быть любая условная оценка, но я просто поделюсь несколькими примерами.
Если вы хотите, чтобы все это было написано в одной строке, вы могли бы просто связать их вместе,
&&
например:источник
Никогда не существовало, чтобы работать.
Я использую, если не существует g: xyz / what goto h: Else xcopy c: current / files g: bu / current Существуют модификаторы / a и т. Д. Не уверен, какие именно. Ноутбук в магазине. И компьютер в офисе. Меня там нет.
Никогда не получалось, что командные файлы работают над Windows XP
источник
Я обычно использую гораздо более быструю альтернативу: я могу «или» произвольное количество условий, которые могут уместиться в переменном пространстве.
источник
Понимая, что это немного старый вопрос, ответы помогли мне придумать решение для тестирования аргументов командной строки для пакетного файла; поэтому я также хотел опубликовать свое решение на случай, если кто-то еще искал подобное решение.
Первое, что я должен отметить, это то, что у меня возникли проблемы с тем, чтобы операторы IF ... ELSE работали внутри предложения FOR ... DO. Оказывается (спасибо dbenham за непреднамеренное указание на это в его примерах) оператор ELSE не может находиться в отдельной строке от закрывающих скобок.
Итак, вместо этого:
Что я предпочитаю по удобочитаемости и эстетическим соображениям, вы должны сделать это:
Теперь оператор ELSE не возвращается как нераспознанная команда.
Наконец, вот что я пытался сделать - я хотел иметь возможность передавать несколько аргументов в пакетный файл в любом порядке, игнорируя регистр и сообщая / сбой при передаче неопределенных аргументов. Итак, вот мое решение ...
Обратите внимание, это будет сообщать только о первом неудачном аргументе. Таким образом, если пользователь передает более одного неприемлемого аргумента, ему будет рассказано только о первом, пока он не будет исправлен, затем о втором и т. Д.
источник