Как использовать структуру if - else в командном файле?

136

У меня есть вопрос о структуре if-else в командном файле. Каждая команда выполняется индивидуально, но я не смог безопасно использовать блоки if - else, поэтому эти части моей программы не работают. Как я могу заставить эти части работать? Спасибо.

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

ELSE IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )
одноименный
источник
Четко ли прочитан мой вопрос? Я читаю это построчно, но мне кажется, что рядом.
одноимённое
4
Привет, добро пожаловать в стек переполнения! Чтобы создать блок кода, вы можете выделить соответствующий текст и нажать {}кнопку; это помогает сделать сообщения более удобочитаемыми и избежать проблем с разметкой. В ответ на ваш вопрос, он делает сейчас! При написании вопроса ниже представлен предварительный просмотр, чтобы вы могли увидеть, как он будет выглядеть после публикации.
Бен
1
Так что спасибо за ваше объяснение. Я собираюсь использовать этот метод.
одноименный

Ответы:

111

Ваш синтаксис неверен. Вы не можете использовать ELSE IF. Похоже, что вам все равно это не нужно. Просто используйте несколько IFутверждений:

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )

IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

Отличная ссылка на пакетный файл: http://ss64.com/nt/if.html

Джеймс Хилл
источник
2
Пожалуйста, исправьте меня, если я ошибаюсь, но я не думаю, что вы можете использовать &&в нескольких ifусловиях, видите мой альтернативный синтаксис?
Бали C
условия if if таковы: «IF% F% == 0» работает безопасно, но когда я добавил &&, он не запускается. Как я могу использовать два условия в if?
одноименный
1
@aprogrammer, посмотрите на мой пример. Если у вас есть несколько условий, используйтеIF condition1 IF condition 2
Джеймс Хилл
Я попробовал ваш ответ, но не смог его запустить, но попробовал еще раз и изменил свой код, и он запустился. Последняя ситуация в какой-то части моего кода выглядит следующим образом: IF% F% == 1 IF% C% == 1 (:: копирование файла c в d, копирование "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: перемещение файла c на d переместить "% sourceFile%" "% destinationFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: копирование каталога c из d, / s: boš olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
одноименный
4
Что вы имеете в виду, вы не можете использовать ELSE IF? Работает нормально под Win7. Смотрите пример: paste2.org/G8tMae92
bryc
56

Я думаю, что в вопросе и в некоторых ответах есть некоторая путаница относительно значения этого псевдокода в DOS: ЕСЛИ A ЕСЛИ BX ДАЛЕЕ Y. Это не означает IF (A и B) THEN X ELSE Y, но в Факт означает, ЕСЛИ А (ЕСЛИ В, ТО X, ИЛИ Y). Если проверка A не удалась, тогда он полностью игнорирует внутреннее if-else.

Как упоминалось в одном из ответов, в этом случае только один из тестов может быть успешным, поэтому «else» не требуется, но, конечно, это работает только в этом примере, это не общее решение для выполнения if-else.

Есть много способов обойти это. Вот несколько идей, все они довольно уродливы, но, эй, это (или, по крайней мере, было) DOS!

@echo off

set one=1
set two=2

REM Example 1

IF %one%_%two%==1_1 (
   echo Example 1 fails
) ELSE IF %one%_%two%==1_2 (
   echo Example 1 works correctly
) ELSE (
    echo Example 1 fails
)

REM Example 2

set test1result=0
set test2result=0

if %one%==1 if %two%==1 set test1result=1
if %one%==1 if %two%==2 set test2result=1

IF %test1result%==1 (
   echo Example 2 fails
) ELSE IF %test2result%==1 (
   echo Example 2 works correctly
) ELSE (
    echo Example 2 fails
)

REM Example 3

if %one%==1 if %two%==1 (
   echo Example 3 fails
   goto :endoftests
)
if %one%==1 if %two%==2 (
   echo Example 3 works correctly
   goto :endoftests
)
echo Example 3 fails
)
:endoftests
gtpunch
источник
Я думаю, что первые два setне нуждаются в знаках процента; должно бытьset one=1
Джефф
13

AFAIK, вы не можете делать if elseв пакетном режиме, как вы можете на других языках, он должен быть вложенным if.

Используя nested if, ваша партия будет выглядеть

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            IF %F%==0 IF %C%==1(
            ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
            xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"
                )
            )
        )
    )

или, как предположил Джеймс, зацепите свои if, однако я думаю, что правильный синтаксис

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
Бали С
источник
1
if elseособенно в C-подобных языках ifтоже просто вложенный . Вам также не нужно вкладывать их в блоки в пакетных файлах.
Джои
@ Джои, я не совсем понимаю. Я знаю, что else ifкомбо это просто вложенный, ifно я не думал, что вы можете использовать эти ключевые слова вместе в пакетном режиме, как вы можете на языках Си.
Бали C
Хм, я до сих пор не могу заставить его работать, но я верю вашему слову, вы знаете, о чем говорите, я оставлю этот ответ как длинную версию :)
Bali C
Спасибо за ваши ответы, но ни один из них не запустился в моем коде.
одноимённое
другой пример: если 1 == 1 (эхо 1), еще (если 1 == 1 (эхо 2), еще (эхо 3))
JohnP2
1

Я считаю, что вы можете использовать что-то такое, как

if ___ (

do this

) else if ___ (

do this

)
user4090570
источник
27
Разве утверждение во втором условии не должно быть «сделать это»?
Bvj
7
@bvj Нет, нет, ты все неправильно понял. Это должно быть do fooи do bar.
yyny
Когда вы пишете IF (test) (command) ELSE IF (test) (command), вы намекаете IF (test) (command) ELSE (IF (test) (command)). Иногда это может работать, но если вы считаете, что это реальная структура программирования, приемлемая в DOS, то это будет PITA для устранения неполадок в случае сбоя.
Тим
1

Немного опоздал и, возможно, все еще хорош для сложных условий if, потому что я хотел бы добавить параметр "done", чтобы сохранить структуру if-then-else:

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)
Стефана
источник
0

IF...ELSE IF конструкции хорошо работают в пакетных файлах, особенно когда вы используете только одно условное выражение в каждой строке IF:

IF %F%==1 (
    ::copying the file c to d
    copy "%sourceFile%1" "%destinationFile1%"
) ELSE IF %F%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%" )

В вашем примере вы используете IF...AND...IFконструкцию типа, где 2 условия должны выполняться одновременно. В этом случае вы все еще можете использовать IF...ELSE IFконструкцию, но с дополнительными скобками, чтобы избежать неопределенности для следующего условия ELSE:

IF %F%==1 (IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%" )
) ELSE IF %F%==1 (IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

Вышеуказанная конструкция эквивалентна:

IF %F%==1 (
    IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%"
    ) ELSE IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

Последовательность обработки пакетных команд зависит от порядка разбора CMD.exe . Просто убедитесь, что ваша конструкция соответствует этому логическому порядку, и, как правило, она будет работать. Если ваш пакетный скрипт обрабатывается Cmd.exe без ошибок, это означает, что это правильная (т.е. поддерживается вашей версией ОС Cmd.exe) конструкция, даже если кто-то сказал иначе.

sambul35
источник
0

Вот мой пример кода для if..else..if
которые делают следующее

Запрашивать у пользователя имя процесса

Если имя процесса недопустимо, то
оно пишется пользователю

Error : The Processor above doesn't seem to be exist 

если имя процесса - services, то
оно пишется пользователю

Error : You can't kill the Processor above 

если имя процесса является действительным, а не службами, то
оно пишется пользователю

процесс был убит с помощьюtaskill

так я назвал это Process killer.bat
Вот мой код:

@echo off

:Start
Rem preparing the batch  
cls
Title Processor Killer
Color 0B
Echo Type Processor name to kill It (Without ".exe")
set /p ProcessorTokill=%=%  

:tasklist
tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
REM check if the process name is invalid 
Cls 
Title %ProcessorTokill% Not Found
Color 0A
echo %ProcessorTokill%
echo Error : The Processor above doesn't seem to be exist    

) else if %ProcessorTokill%==services (
REM check if the process name is services and doesn't kill it
Cls 
Color 0c
Title Permission denied 
echo "%ProcessorTokill%.exe"
echo Error : You can't kill the Processor above 

) else (
REM if the process name is valid and not services
Cls 
Title %ProcessorTokill% Found
Color 0e
echo %ProcessorTokill% Found
ping localhost -n 2 -w 1000>nul
echo Killing %ProcessorTokill% ...
taskkill /f /im %ProcessorTokill%.exe /t>nul
echo %ProcessorTokill% Killed...
)

pause>nul



REM If else if Template
REM if thing1 (
REM Command here 2 ! 
REM ) else if thing2 (
REM command here 2 !
REM ) else (
REM command here 3 !
REM )
Оймар Даиф
источник
0

вот как я справился, если еще, если ситуация

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

Обратите внимание, что он не совпадает с блоком if-elseif, как другие языки программирования, такие как C ++ или Java, но он будет делать то, что вам нужно

Амадо Саладино
источник