ЕСЛИ ... ИЛИ ЕСЛИ ... в командном файле Windows - PullRequest
76 голосов
/ 09 декабря 2011

Есть ли способ написать условный оператор IF ИЛИ IF в пакетном файле Windows?

Например:

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

Ответы [ 13 ]

0 голосов
/ 01 ноября 2017

Никогда не существовал, чтобы работать.

я использую если не существует g: xyz / что такое h: Иначе xcopy c: current / files g: bu / current Есть модификаторы / и т. Д. Не уверен, какие из них. Ноутбук в магазине. И компьютер в офисе. Я не там.

Никогда не получал командные файлы для работы выше Windows XP

0 голосов
/ 19 августа 2016

Хотя ответ dbenham довольно хороший, использование IF DEFINED может доставить вам массу неприятностей, если проверяемая вами переменная не является переменной environment . Переменные сценария не получают эту специальную обработку.

Хотя это может показаться нелепым недокументированным BS, выполнение простого запроса оболочки IF с IF /? показывает, что

Условное выражение DEFINED работает так же, как EXIST, за исключением того, что оно требует environment имя переменной и возвращает true, если environment переменная определяется.

Что касается ответа на этот вопрос, есть ли причина не просто использовать простой флаг после серии оценок? Это кажется наиболее гибкой OR проверкой для меня, как в отношении базовой логики, так и в отношении читабельности. Например:

Set Evaluated_True=false

IF %condition_1%==true (Set Evaluated_True=true)
IF %some_string%=="desired result" (Set Evaluated_True=true)
IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)

IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)

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

Если вы хотите, чтобы все было в одной строке, в письменном виде, вы можете просто связать их вместе с &&, например:

Set Evaluated_True=false

IF %condition_1%==true (Set Evaluated_True=true) && IF %some_string%=="desired result" (Set Evaluated_True=true) && IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)

IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)
0 голосов
/ 09 сентября 2012

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

Первое, на что я должен обратить внимание, это то, что у меня возникли проблемы с получением операторов IF ... ELSE для работы внутрипредложение FOR ... DO.Оказывается (спасибо dbenham за непреднамеренное указание на это в его примерах), оператор ELSE не может находиться на отдельной строке от закрывающих скобок.

Так что вместо этого:

FOR ... DO (
    IF ... (
    )
    ELSE (
    )
)

, Которыйя предпочитаю удобочитаемость и эстетические соображения, вы должны сделать это:

FOR ... DO (
    IF ... (
    ) ELSE (
    )
)

Теперь оператор ELSE не возвращается как нераспознанная команда.

Наконец, вот что я пыталсячтобы сделать - я хотел иметь возможность передавать несколько аргументов в пакетный файл в любом порядке, игнорируя регистр и сообщая / отказывая по неопределенным аргументам, переданным внутрь. Так вот мое решение ...

@ECHO OFF
SET ARG1=FALSE
SET ARG2=FALSE
SET ARG3=FALSE
SET ARG4=FALSE
SET ARGS=(arg1 Arg1 ARG1 arg2 Arg2 ARG2 arg3 Arg3 ARG3)
SET ARG=

FOR %%A IN (%*) DO (
    SET TRUE=
    FOR %%B in %ARGS% DO (
        IF [%%A] == [%%B] SET TRUE=1
        )
    IF DEFINED TRUE (
        SET %%A=TRUE
        ) ELSE (
        SET ARG=%%A
        GOTO UNDEFINED
        )
    )

ECHO %ARG1%
ECHO %ARG2%
ECHO %ARG3%
ECHO %ARG4%
GOTO END

:UNDEFINED
ECHO "%ARG%" is not an acceptable argument.
GOTO END

:END

Примечание, это будет сообщать только о первом неудачном аргументе.Поэтому, если пользователь передает более одного неприемлемого аргумента, ему сообщается только о первом, пока он не будет исправлен, затем о втором и т. Д.

...