Как использовать структуру 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%"
    )

7 ответов


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


Я думаю, в вопрос и в ответы есть немного путаницы о значении этого псевдокода в DOS: в случае если б х еще Я. Это не значит, если(A и B), то X то y, но на самом деле означает, что если a( если B, то Х-то еще Г). Если тест А провалится, то он все внутреннее если-остальное будет проигнорировано.

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

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

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

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

if ___ (

do this

) else if ___ (

do this

)

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

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 построить, но с дополнительными скобками, чтобы избежать неопределенности для следующего условия:

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-версия) построить, даже если кто-то говорит иначе.


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

запрос пользователя для имени процесса

если имя процесса недействительным
Тогда это написать пользователю

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

если имя процесса услуги
Тогда это написать пользователю

Error : You can't kill the Processor above 

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

на процесс был убит через taskill

так я его назвал убийца процесса.летучая мышь!--11-->
Вот мой код:

@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 )