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

121

У меня есть вопрос о структуре 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%"
    )
Так что спасибо за ваше объяснение. Я собираюсь использовать этот метод. selentoptas
Четко ли прочитан мой вопрос? Я читаю это построчно, но мне кажется, что рядом. selentoptas
Привет, добро пожаловать в стек переполнения! Чтобы создать блок кода, вы можете выделить соответствующий текст и нажать{} кнопка; это помогает сделать сообщения более читабельными и избежать проблем с разметкой. В ответ на ваш вопрос, он делает сейчас! При написании вопроса ниже предлагается предварительный просмотр, чтобы вы могли увидеть, как он будет выглядеть после публикации. Ben

Ваш Ответ

7   ответов
49

Я думаю, что в этом вопросе и в некоторых ответах есть некоторая путаница относительно значения этого псевдокода в DOS: ЕСЛИ A ЕСЛИ BX ДАЛЕЕ Y. Это не означает IF & # xFF08; A и B) THEN X ELSE Y, но на самом деле означает ЕСЛИ А (ЕСЛИ В, ТО Х, ЛИБО Y). Если проверка A не удалась, тогда он полностью игнорирует внутреннее if-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
Я думаю первые дваset не нужны знаки процента; должно бытьset one=1
0

Вот мой пример кода для if..else..if
which do the following

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

Если имя процессаinvalid
Then it's write to user

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

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

Error : You can't kill the Processor above 

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

process  был убит через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 )
98

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

Что вы имеете в виду, что вы не можете использоватьELSE IF? Работает нормально под Win7. Смотрите пример:paste2.org/G8tMae92
@aprogrammer, посмотрите на мой пример. Если у вас есть несколько условий, используйтеIF condition1 IF condition 2
@BaliC, Вы правы. Слишком много C # сегодня :)
условия if if такие: & quot; IF% F% == 0 & quot; работать безопасно, но когда я добавил & amp; & amp; он не работает. Как я могу использовать два условия в if? selentoptas
Пожалуйста, исправьте меня, если я ошибаюсь, но я не думаю, что вы можете использовать&& в несколькихif условия, видите мой альтернативный синтаксис?
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) конструкция, даже если кто-то сказал иначе.

1

Немного опоздал и, возможно, все еще хорош для сложных if-условий, потому что я хотел бы добавить & quot; done & quot; параметр для сохранения структуры 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)
1

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

if ___ (

do this

) else if ___ (

do this

)
Я не знаю, почему у людей с нулевым знанием есть возможность понизить голос.
Когда ты пишешьIF (test) (command) ELSE IF (test) (command)вы намекаетеIF (test) (command) ELSE (IF (test) (command)), Иногда это может работать, но если вы считаете, что это реальная структура программирования, приемлемая в DOS, то это будет PITA для устранения неполадок в случае сбоя.
Ответ и комментарии смешные!
@bvj Нет, нет, ты все неправильно понял. Так должно бытьdo foo а такжеdo bar.
Разве «утверждение» во втором условии не должно «делать это»?
11

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

Использование вложенных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's, однако я думаю, что правильный синтаксис

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

Похожие вопросы