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

У меня вопрос о структуре 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%"
    )

Ответ 1

Ваш синтаксис неверен. Вы не можете использовать 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

Я думаю, что в вопросе и в некоторых ответах есть немного путаницы в отношении значения этого псевдокода в DOS: IF A IF BX ELSE Y. Это не означает IF (A и B) THEN X ELSE Y, но на самом деле означает IF A (IF B THEN X ELSE Y). Если тест A терпит неудачу, тогда весь внутренний if-else будет проигнорирован.

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

Существует много способов обойти это. Вот несколько идей, все довольно уродливые, но эй, это (или, по крайней мере, было) 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

Ответ 3

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

Использование вложенной 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%"
    )

Ответ 4

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

if ___ (

do this

) else if ___ (

do this

)

Ответ 5

Немного поздно и, возможно, все еще полезно для сложных 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)

Ответ 6

Конструкции

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, где должны выполняться два условия одновременно. В этом случае вы можете использовать конструкцию 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. Просто убедитесь, что ваша конструкция следует этому логическому порядку, и, как правило, она будет работать. Если ваш пакет script обрабатывается Cmd.exe без ошибок, это означает, что это правильно (т.е. Поддерживается версией вашей ОС Cmd.exe), даже если кто-то сказал иначе.