Làm thế nào để sử dụng cấu trúc if - other trong một tệp bó?


136

Tôi có một câu hỏi về cấu trúc if - other trong một tệp bó. Mỗi lệnh chạy riêng lẻ, nhưng tôi không thể sử dụng các khối "nếu - khác" một cách an toàn để các phần này trong chương trình của tôi không hoạt động. Làm thế nào tôi có thể làm cho những phần này chạy? Cảm ơn bạn.

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

Là câu hỏi của tôi đọc rõ ràng? Tôi đọc từng dòng một nhưng nó dường như bên cạnh tôi.
cùng tên

4
Xin chào, Chào mừng bạn đến với Stack Overflow! Để tạo một khối mã, bạn có thể đánh dấu văn bản có liên quan và nhấp vào {}nút; nó giúp làm cho bài viết dễ đọc hơn và tránh một số vấn đề với việc đánh dấu. Trả lời câu hỏi của bạn, bây giờ nó làm! Khi viết câu hỏi, có một bản xem trước bên dưới để bạn có thể thấy nó sẽ trông như thế nào khi được đăng.
Ben

1
Vì vậy, cảm ơn bạn đã giải thích của bạn. Tôi sẽ sử dụng các phương pháp này.
cùng tên

Câu trả lời:


110

Cú pháp của bạn không chính xác. Bạn không thể sử dụng ELSE IF. Dường như bạn không thực sự cần nó. Đơn giản chỉ cần sử dụng nhiều IFcâu lệnh:

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

Tài liệu tham khảo tập tin tuyệt vời: http://ss64.com/nt/if.html


2
Vui lòng sửa tôi nếu tôi sai, nhưng tôi không nghĩ bạn có thể sử dụng &&trong nhiều ifđiều kiện, xem cú pháp thay thế của tôi?
Bali C

nếu điều kiện if của tôi là như thế này: "IF% F% == 0" chạy an toàn nhưng khi tôi thêm && thì nó không chạy. Làm thế nào tôi có thể sử dụng hai điều kiện trong một nếu?
cùng tên

1
@aprogrammer, Hãy xem ví dụ của tôi. Nếu bạn có nhiều điều kiện, hãy sử dụngIF condition1 IF condition 2
James Hill

Tôi đã thử câu trả lời của bạn nhưng tôi không thể chạy nó nhưng tôi đã thử lại và sửa đổi thành mã ant của tôi. Tình huống cuối cùng của một số phần mã của tôi là như sau: IF% F% == 1 IF% C% == 1 (:: sao chép tệp c để sao chép "% sourceFile%" "% DestinationFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: di chuyển tệp c sang d di chuyển "% sourceFile%" "% DestinationFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: sao chép thư mục c từ d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% DestinationCopyDirectory%" / s / e))
cùng tên

4
Bạn có nghĩa là bạn không thể sử dụng ELSE IF? Nó hoạt động tốt dưới Win7. Xem ví dụ: paste2.org/G8tMae92
bryc

56

Tôi nghĩ trong câu hỏi và trong một số câu trả lời có một chút nhầm lẫn về ý nghĩa của mã giả này trong DOS: IF A IF BX ELSE Y. Nó không có nghĩa là IF A và B) THEN X ELSE Y, nhưng trong thực tế có nghĩa là NẾU A (NẾU B THEN X ELSE Y). Nếu bài kiểm tra của A thất bại, thì toàn bộ phần bên trong nếu không sẽ bị bỏ qua.

Như một trong những câu trả lời được đề cập, trong trường hợp này chỉ có một trong các thử nghiệm có thể thành công nên không cần 'cái khác', nhưng tất nhiên chỉ hoạt động trong ví dụ này, nó không phải là một giải pháp chung để thực hiện nếu không.

Có rất nhiều cách xung quanh này. Dưới đây là một vài ý tưởng, tất cả đều khá xấu xí, nhưng này, đây là (hoặc ít nhất là) 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

Tôi nghĩ rằng hai người đầu tiên setkhông cần dấu hiệu phần trăm; nên làset one=1
Geoff

13

AFAIK bạn không thể thực hiện một if elseđợt như bạn có thể bằng các ngôn ngữ khác, nó phải được lồngif .

Sử dụng iflô của bạn sẽ như thế nào

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

hoặc như James đề xuất, xâu chuỗi của bạn if, tuy nhiên tôi nghĩ cú pháp thích hợp là

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

1
if else, đặc biệt trong các ngôn ngữ giống như C cũng chỉ là một lồng nhau if. Bạn cũng không phải lồng chúng với các khối trong các tệp bó.
Joey

@ Tôi không làm theo. Tôi biết rằng else ifcombo chỉ là một lồng nhau ifnhưng tôi không nghĩ bạn có thể sử dụng các từ khóa đó cùng nhau theo đợt như bạn có thể sử dụng bằng ngôn ngữ C.
Bali C

Hmm Tôi vẫn không thể làm cho nó hoạt động được, nhưng tôi sẽ tin bạn, bạn biết bạn đang nói gì, tôi sẽ để lại câu trả lời này như một phiên bản dài :)
Bali C

Cảm ơn bạn đã trả lời nhưng không ai trong số họ không chạy trong mã của tôi.
cùng tên

một ví dụ khác: if 1 == 1 (echo 1)
other

1

Tôi tin rằng bạn có thể sử dụng một cái gì đó như

if ___ (

do this

) else if ___ (

do this

)

27
Không nên tuyên bố trong điều kiện thứ hai là "làm điều đó"?
bvj

7
@bvj Không, không, bạn đã hiểu sai tất cả. Nó nên do foodo bar.
yyny

Khi bạn viết IF (test) (command) ELSE IF (test) (command), bạn đang ngụ ý IF (test) (command) ELSE (IF (test) (command)). Điều này đôi khi có thể hoạt động, nhưng nếu bạn tin rằng đó là một cấu trúc lập trình thực tế có thể chấp nhận được trong DOS thì đó sẽ là một PITA để khắc phục sự cố khi nó bị lỗi.
Tim

1

Một chút muộn và có lẽ vẫn tốt cho các điều kiện if phức tạp, bởi vì tôi muốn thêm một tham số "xong" để giữ cấu trúc if-then-other:

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 cấu trúc hoạt động rất tốt trong các tệp bó, đặc biệt khi bạn chỉ sử dụng một biểu thức điều kiện trên mỗi dòng 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%" )

Trong ví dụ của bạn, bạn sử dụng IF...AND...IFkiểu xây dựng, trong đó 2 điều kiện phải được đáp ứng đồng thời. Trong trường hợp này, bạn vẫn có thể sử dụng IF...ELSE IFcấu trúc, nhưng có thêm dấu ngoặc đơn để tránh sự không chắc chắn cho điều kiện ELSE tiếp theo:

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

Cấu trúc trên tương đương với:

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

Trình tự xử lý các lệnh bó tùy thuộc vào thứ tự phân tích cú pháp CMD.exe . Chỉ cần đảm bảo rằng cấu trúc của bạn tuân theo thứ tự logic đó và theo quy tắc, nó sẽ hoạt động. Nếu tập lệnh bó của bạn được xử lý bởi Cmd.exe mà không có lỗi, điều đó có nghĩa đây là cấu trúc chính xác (nghĩa là được hỗ trợ bởi phiên bản OS Cmd.exe của bạn), ngay cả khi có ai đó nói khác.


0

Đây là mã của tôi Ví dụ cho if..else..if
mà làm như sau

Nhắc người dùng cho Tên quy trình

Nếu tên tiến trình không hợp lệ
thì nó sẽ ghi cho người dùng

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

nếu tên tiến trình là dịch vụ
thì nó sẽ ghi cho người dùng

Error : You can't kill the Processor above 

nếu tên quy trình hợp lệ và không phải dịch vụ
thì nó sẽ ghi cho người dùng

các quá trình đã bị giết quataskill

vì vậy tôi gọi nó là Process killer.bat
Đây là Mã của tôi:

@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

đây là cách tôi xử lý nếu khác

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

Lưu ý rằng nó không giống như khối if-otherif như các ngôn ngữ lập trình khác như C ++ hoặc Java nhưng nó sẽ làm những gì bạn cần làm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.