วิธีใช้ if - else โครงสร้างในไฟล์แบตช์


137

ฉันมีคำถามเกี่ยวกับโครงสร้าง 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
สวัสดียินดีต้อนรับสู่ Stack Overflow! ในการสร้างบล็อกโค้ดคุณสามารถไฮไลต์ข้อความที่เกี่ยวข้องแล้วคลิก{}ปุ่ม ช่วยให้อ่านโพสต์ได้ง่ายขึ้นและหลีกเลี่ยงปัญหาบางอย่างเกี่ยวกับการมาร์กอัป ตอบคำถามของคุณตอนนี้เลย! เมื่อเขียนคำถามจะมีตัวอย่างด้านล่างเพื่อให้คุณสามารถดูได้ว่าเมื่อโพสต์แล้วจะเป็นอย่างไร
เบ็น

1
ขอบคุณสำหรับคำอธิบาย ฉันจะใช้วิธีการเหล่านี้
บาร์นี้

คำตอบ:


112

ไวยากรณ์ของคุณไม่ถูกต้อง คุณไม่สามารถใช้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เงื่อนไขโปรดดูไวยากรณ์ทางเลือก
Bali C

หากเงื่อนไข if ของฉันเป็นเช่นนี้: "IF% F% == 0" จะทำงานได้อย่างปลอดภัย แต่เมื่อฉันเพิ่ม && มันไม่ทำงาน ฉันจะใช้สองเงื่อนไขใน if ได้อย่างไร
บาร์โค้ด

1
@aprogrammer ดูตัวอย่างของฉัน หากคุณมีเงื่อนไขหลายข้อให้ใช้IF condition1 IF condition 2
James Hill

ฉันได้ลองคำตอบของคุณแล้ว แต่ฉันไม่สามารถเรียกใช้มันได้ แต่ฉันลองอีกครั้งและแก้ไขให้โค้ดของฉันทำงาน สถานการณ์สุดท้ายของโค้ดบางส่วนเป็นเช่นนี้: IF% F% == 1 IF% C% == 1 (:: คัดลอกไฟล์ c to d copy "% 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))
eponymous

4
คุณหมายความว่าอะไรคุณใช้ELSE IFไม่ได้? ทำงานได้ดีภายใต้ Win7 ดูตัวอย่าง: paste2.org/G8tMae92
bryc

56

ฉันคิดว่าในคำถามและในบางคำตอบมีความสับสนเล็กน้อยเกี่ยวกับความหมายของรหัสเทียมนี้ใน DOS: IF A IF BX ELSE Y ไม่ได้หมายถึง IF (A และ B) แล้ว X ELSE Y แต่ใน ข้อเท็จจริงหมายถึง IF A (IF B แล้ว X ELSE 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

ฉันคิดว่าสองคนแรกsetไม่ต้องการเครื่องหมายเปอร์เซ็นต์ ควรจะเป็นset one=1
Geoff

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โดยเฉพาะอย่างยิ่งใน C เหมือนภาษาเป็นเพียงซ้อนกันifมากเกินไป คุณไม่จำเป็นต้องซ้อนทับด้วยบล็อกในไฟล์แบตช์เช่นกัน
Joey

@ โจอี้ไม่ค่อยติดตาม ฉันรู้ว่าelse ifคำสั่งผสมเป็นเพียงการซ้อนกันifแต่ฉันไม่คิดว่าคุณจะสามารถใช้คำหลักเหล่านั้นร่วมกันเป็นกลุ่มเหมือนที่คุณสามารถทำได้ในภาษาซี
Bali C

อืมฉันยังไม่สามารถใช้งานได้ แต่ฉันจะรับฟังคุณรู้ว่าคุณกำลังพูดถึงอะไรฉันจะปล่อยให้คำตอบนี้เป็นเวอร์ชั่นยาว :)
Bali C

ขอบคุณสำหรับคำตอบของคุณ แต่ไม่มีคำตอบใดที่ไม่ทำงานในรหัสของฉัน
บาร์โค้ด

ตัวอย่างอื่น: if 1 == 1 (echo 1) else (if 1 == 1 (echo 2) else (echo 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-condition ที่ซับซ้อนเพราะฉันต้องการเพิ่มพารามิเตอร์ "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 โดยไม่มีข้อผิดพลาดหมายความว่านี่เป็นโครงสร้างที่ถูกต้อง (เช่นรองรับโดย OS Cmd.exe เวอร์ชันของคุณ) แม้ว่าจะมีคนพูดเป็นอย่างอื่นก็ตาม


0

นี่คือตัวอย่างรหัสของฉันสำหรับ if..else..if
ซึ่งทำดังต่อไปนี้

แจ้งผู้ใช้สำหรับชื่อกระบวนการ

หากชื่อกระบวนการไม่ถูกต้อง
ก็จะเขียนถึงผู้ใช้

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

ถ้าชื่อกระบวนการคือบริการ
จากนั้นจะเขียนถึงผู้ใช้

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 block เหมือนกับภาษาโปรแกรมอื่น ๆ เช่น C ++ หรือ Java แต่จะทำในสิ่งที่คุณต้องทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.