Bagaimana cara menggunakan struktur if - else dalam file batch?

137

Saya punya pertanyaan tentang struktur if - else dalam file batch. Setiap perintah berjalan secara individual, tetapi saya tidak dapat menggunakan blok "if - else" dengan aman sehingga bagian dari program saya ini tidak berfungsi. Bagaimana saya bisa membuat bagian-bagian ini berjalan? Terima kasih.

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%"
    )
eponim
sumber
Apakah pertanyaan saya terbaca dengan jelas? Saya membacanya baris demi baris tetapi bagi saya tampaknya berdampingan.
eponim
4
Hai, Selamat Datang di Stack Overflow! Untuk membuat blok kode, Anda dapat menyorot teks yang relevan dan mengklik {}tombol; ini membantu membuat postingan lebih mudah dibaca dan menghindari beberapa masalah dengan mark-up. Sebagai jawaban atas pertanyaan Anda, sekarang! Saat menulis pertanyaan, ada pratinjau di bawah ini sehingga Anda dapat melihat tampilannya setelah diposting.
Ben
1
Jadi terima kasih atas penjelasannya. Saya akan menggunakan metode ini.
eponim

Jawaban:

112

Sintaks Anda salah. Anda tidak bisa menggunakan ELSE IF. Tampaknya Anda tidak terlalu membutuhkannya. Cukup gunakan beberapa IFpernyataan:

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

Referensi file batch yang bagus: http://ss64.com/nt/if.html

James Hill
sumber
2
Harap perbaiki saya jika saya salah, tetapi saya rasa Anda tidak dapat menggunakan &&dalam beberapa ifkondisi, lihat sintaks alternatif saya?
Bali C
jika kondisi if saya seperti ini: "IF% F% == 0" berjalan dengan aman tetapi ketika saya menambahkan && tidak berjalan. Bagaimana saya bisa menggunakan dua kondisi dalam if?
eponim
1
@ programmer, Lihat contoh saya. Jika Anda memiliki beberapa kondisi, gunakanIF condition1 IF condition 2
James Hill
Saya telah mencoba jawaban Anda tetapi saya tidak dapat menjalankannya tetapi saya mencoba lagi dan memodifikasi ke kode saya dan menjalankannya. Situasi terakhir dari beberapa bagian kode saya adalah seperti ini: IF% F% == 1 IF% C% == 1 (:: menyalin file c ke d salin "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 JIKA% C% == 0 (:: memindahkan file c ke d memindahkan "% sourceFile%" "% destinationFile%")) ELSE (JIKA% F% == 0 JIKA% C% == 1 (:: menyalin direktori c dari d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
eponim
4
Apa maksud Anda tidak dapat Anda gunakan ELSE IF? Ia bekerja dengan baik di bawah Win7. Lihat contoh: paste2.org/G8tMae92
bryc
56

Menurut saya di pertanyaan dan di beberapa jawaban ada sedikit kebingungan tentang arti pseudocode ini di DOS: IF A IF BX ELSE Y. Bukan berarti IF (A dan B) THEN X ELSE Y, tapi di Fakta berarti IF A (IF B THEN X ELSE Y). Jika pengujian A gagal, maka seluruh inner if-else akan diabaikan.

Sebagai salah satu jawaban yang disebutkan, dalam hal ini hanya satu dari tes yang dapat berhasil sehingga 'lain' tidak diperlukan, tetapi tentu saja itu hanya berfungsi dalam contoh ini, ini bukan solusi umum untuk melakukan if-else.

Ada banyak cara untuk mengatasi ini. Berikut adalah beberapa ide, semuanya cukup jelek tapi hei, ini (atau setidaknya) 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
gtpunch
sumber
Saya pikir dua yang pertama settidak membutuhkan tanda persen; harusset one=1
Geoff
13

AFAIK Anda tidak bisa melakukan if elsebatch seperti yang Anda bisa dalam bahasa lain, itu harus bersarang if.

Menggunakan ifkumpulan bersarang Anda akan terlihat seperti

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

atau seperti yang disarankan James, rangkai milik Anda if, namun menurut saya sintaks yang tepat adalah

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
Bali C
sumber
1
if else, terutama dalam bahasa C-like juga hanya bersarang if. Anda juga tidak harus menyarangkannya dengan blok dalam file batch.
Joey
@Joey Saya tidak begitu mengikuti. Saya tahu else ifkombo itu hanya bersarang iftetapi saya tidak berpikir Anda dapat menggunakan kata kunci itu bersama-sama dalam batch seperti yang Anda bisa dalam bahasa C.
Bali C
Hmm saya masih belum bisa membuatnya berfungsi, tetapi saya akan percaya pada kata-kata Anda, Anda tahu apa yang Anda bicarakan, saya akan tinggalkan jawaban ini sebagai versi panjang :)
Bali C
Terima kasih atas jawaban Anda tetapi tidak ada yang tidak berjalan di kode saya.
eponim
contoh lain: if 1 == 1 (echo 1) else (if 1 == 1 (echo 2) else (echo 3))
JohnP2
1

Saya yakin Anda dapat menggunakan sesuatu seperti

if ___ (

do this

) else if ___ (

do this

)
pengguna4090570
sumber
27
Bukankah seharusnya pernyataan dalam kondisi kedua adalah "lakukan itu"?
bvj
7
@bvj Tidak, tidak, Anda salah paham. Ini harus do foodan do bar.
yyny
Saat Anda menulis IF (test) (command) ELSE IF (test) (command), Anda menyiratkan IF (test) (command) ELSE (IF (test) (command)). Ini mungkin bekerja kadang-kadang, tetapi jika Anda yakin itu adalah struktur pemrograman aktual yang dapat diterima di DOS maka itu akan menjadi PITA untuk memecahkan masalah ketika gagal.
Tim
1

Sedikit terlambat dan mungkin masih bagus untuk kondisi if yang kompleks, karena saya ingin menambahkan parameter "selesai" untuk mempertahankan struktur 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)
Stefane
sumber
0

IF...ELSE IF konstruksi bekerja sangat baik dalam file batch, khususnya saat Anda hanya menggunakan satu ekspresi bersyarat di setiap baris 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%" )

Dalam contoh Anda, Anda menggunakan IF...AND...IFtipe konstruksi, di mana 2 kondisi harus dipenuhi secara bersamaan. Dalam kasus ini, Anda masih dapat menggunakan IF...ELSE IFkonstruksi, tetapi dengan tambahan tanda kurung untuk menghindari ketidakpastian untuk kondisi ELSE berikutnya:

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

Konstruksi di atas setara dengan:

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

Urutan pemrosesan perintah batch tergantung pada urutan penguraian CMD.exe . Pastikan saja konstruksi Anda mengikuti urutan logis itu, dan sebagai aturan, itu akan berhasil. Jika skrip batch Anda diproses oleh Cmd.exe tanpa kesalahan, itu berarti ini adalah konstruksi yang benar (yaitu didukung oleh versi OS Cmd.exe Anda), bahkan jika seseorang mengatakan sebaliknya.

sambul35
sumber
0

Berikut contoh kode saya untuk if..else..if
yang melakukan hal berikut

Prompt pengguna untuk Nama Proses

Jika nama proses tidak valid
Kemudian tulis ke pengguna

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

jika nama proses adalah layanan
Kemudian tulis ke pengguna

Error : You can't kill the Processor above 

jika nama proses valid dan bukan layanan,
maka tuliskan ke pengguna

yang proses telah dibunuh melaluitaskill

jadi saya menyebutnya Proses killer.bat
Inilah Kode saya:

@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 )
Oimar Daif
sumber
0

inilah cara saya menangani jika lain jika situasi

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

Perhatikan bahwa ini tidak sama dengan blok if-elseif dengan bahasa pemrograman lain seperti C ++ atau Java tetapi akan melakukan apa yang perlu Anda lakukan

Amado Saladino
sumber