2012-06-18 20 views
105

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

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

là câu hỏi của tôi đọc rõ ràng không? Tôi đọc nó theo từng dòng nhưng có vẻ như bên cạnh tôi. – selentoptas

+3

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. Trong câu trả lời cho câu hỏi của bạn, nó hiện nay! Khi viết một câu hỏi có một bản xem trước dưới đây để bạn có thể xem nó sẽ trông như thế nào khi được đăng. – Ben

+1

Cảm ơn bạn đã giải thích. Tôi sẽ sử dụng phương pháp này. – selentoptas

Trả lời

89

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

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

lớn batch file tài liệu tham khảo: http://ss64.com/nt/if.html

+1

Hãy sửa tôi nếu tôi sai, nhưng tôi không nghĩ rằng bạn có thể sử dụng '&&' trong nhiều điều kiện 'if', xem cú pháp thay thế của tôi? –

+1

@BaliC, bạn đã đúng. Quá nhiều C# hôm nay :) –

+0

nếu điều kiện if của tôi như sau: "IF% F% == 0" chạy an toàn nhưng khi tôi thêm && 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? – selentoptas

9

AFAIK bạn không thể làm một if else trong hàng loạt như bạn có thể bằng các ngôn ngữ khác, nó phải được lồng if 's.

Sử dụng lồng nhau if 's batch của bạn sẽ trông giống như

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 đề nghị, chuỗi của bạn if' s, tuy nhiên tôi nghĩ rằng cú pháp thích hợp là

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

' nếu có', đặc biệt là trong các ngôn ngữ C-like cũng chỉ là một 'if' lồng nhau. Bạn không cần phải lồng chúng với các khối trong các tập tin theo lô, hoặc là – Joey

+0

@Joey Tôi không thực sự tuân theo. Tôi biết' else if' combo chỉ là một 'if' lồng nhau nhưng Tôi không nghĩ rằng bạn có thể sử dụng những từ khóa với nhau theo lô như bạn có thể bằng ngôn ngữ C. –

+1

Bạn có thể; Tôi vừa thử :-) – Joey

43

Tôi nghĩ rằng 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: NẾU A BX ELSE Y. Nó không có nghĩa là IF (A và B) THEN X ELSE Y, nhưng trên thực tế có nghĩa là NẾU A (NẾU B THEN X ELSE Y). Nếu thử nghiệm của A thất bại, thì toàn bộ bên trong if-else sẽ bị bỏ qua.

Là 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 bài kiểm tra có thể thành công để 'không' là cần thiết, nhưng tất nhiên chỉ hoạt động trong ví dụ này, nó không phải là giải pháp chung để làm -.

Có rất nhiều cách để giải quyết vấn đề này. Dưới đây là một vài ý tưởng, tất cả đều khá xấu xí nhưng hey, đâ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 
+0

Tôi nghĩ rằng hai tập đầu tiên 'không cần dấu hiệu phần trăm; nên 'đặt một = 1' – Geoff

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 

) 
+24

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

+5

@bvj Không, không, bạn đã hiểu sai. Nó phải là 'do foo' và' do bar'. – YoYoYonnY

+0

Câu trả lời và nhận xét rất vui nhộn! –

0

IF...ELSE IF cấu trúc hoạt động rất tốt trong các tập tin batch, đặc biệt là khi bạn chỉ sử dụng một biểu thức điều kiện trên mỗi dòng NẾU:

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 cấu trúc loại IF...AND...IF, 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 IF xây dựng, nhưng với dấu ngoặc thêm để 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ác cấu trúc trên là 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%")) 

Processing chuỗi các lệnh batch phụ thuộc trên CMD.exe parsing order. 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 batch 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 đúng (tức là được hỗ trợ bởi phiên bản OS Cmd.exe) của bạn, ngay cả khi ai đó nói khác đi.

1

Một chút muộn và có lẽ vẫn tốt cho phức tạp nếu điều kiện, bởi vì tôi muốn thêm một "thực hiện" tham số để giữ cho một cấu trúc 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

Dưới đây là Ví dụ mã của tôi cho if..else..if
mà thực hiện như sau

nhắc người dùng cho tên Process

Nếu tên quá trình là không hợp lệ
Sau đó, nó viết thư cho người sử dụng

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

nếu tên quá trình là dịch vụ
Sau đó, nó viết thư cho người sử dụng

Error : You can't kill the Processor above 

nếu tên quá trình là hợp lệ và không dịch vụ
Sau đó, nó viết thư cho người dùng

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

vì vậy tôi gọi nó là Process killer.bat
Dưới đâ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) 
Các vấn đề liên quan