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


136

У мене є питання про структуру 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
Тож дякую за ваше пояснення. Я збираюся використовувати цей метод.
однойменний

Відповіді:


110

Ваш синтаксис невірний. Ви не можете використовувати 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% F% == 0" виконайте безпечно, але коли я додав &&, він не працює. Як я можу використати дві умови у випадку if?
однойменний

1
@aprogrammer, Подивіться на мій приклад. Якщо у вас кілька умов, використовуйтеIF condition1 IF condition 2
James Hill

Я спробував вашу відповідь, але я не міг її запустити, але спробував ще раз і змінив на свій код, і він запустився. Остання ситуація в частині мого коду така: IF% F% == 1 IF% C% == 1 (:: копіювання файлу c в d копію "% sourceFile%" "% призначенняFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: переміщення файлу c в d переміщення "% sourceFile%" "% призначенняFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: копіювання каталогу c з d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% призначенняCopyDirectory%" / s / e))
однойменний

4
Що ти означає, що ти не можеш використовувати ELSE IF? Це добре працює під Win7. Дивіться приклад: paste2.org/G8tMae92
bryc

56

Я думаю, що у запитанні та в деяких відповідях є дещо плутанина щодо значення цього псевдокоду в DOS: АКО АКОГО BX ELSE Y. Це не означає, якщо IF (A і B) THEN X ELSE Y, а в Факт означає, АКО А (ЯКЩО БІЛИ X ELSE Y). Якщо випробування A не вдасться, він буде ігнорований цілим внутрішнім if-else.

Як одна з згаданих відповідей, у цьому випадку лише один із тестів може досягти успіху, тому '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
Джефф

13

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%"
    )

1
if else, особливо на мовах, подібних до С, також є лише вкладеним if. Вам також не потрібно вкладати їх блоками в пакетні файли.
Джої

@Joey Я не дуже дотримуюся. Я знаю, що else ifкомбо - це лише вкладене, ifале я не думав, що ви можете використовувати ці ключові слова разом у пакеті, як ви можете, на мовах C.
Балі C

Хм, я все ще не можу змусити його працювати, але я візьму на це ваше слово, ви знаєте, про що ви говорите, я залишаю цю відповідь як довгу версію :)
Bali C

Дякую за відповіді, але жодна з них не працювала в моєму коді.
однойменний

інший приклад: якщо 1 == 1 (ехо 1) інше (якщо 1 == 1 (ехо 2) ще (ехо 3))
JohnP2

1

Я вважаю, ви можете використовувати щось таке, як

if ___ (

do this

) else if ___ (

do this

)

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-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), навіть якщо хтось сказав інше.


0

Ось мій приклад коду для if..else..якщо
виконайте наступне

Запропонуйте користувачеві ім'я процесу

Якщо ім'я процесу недійсне,
тоді воно пише користувачеві

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

якщо назва процесу - це послуги,
тоді він пише користувачеві

Error : You can't kill the Processor above 

якщо ім'я процесу є дійсним, а не службами,
тоді воно пише користувачеві

процес був убитий з допомогоюtaskill

тому я назвав це процес 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, але він буде робити все, що вам потрібно зробити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.