Anda juga bisa menggunakan set res=atau set res=1kemudian if defined resyang sedikit lebih kuat terhadap kesalahan ketik dan bekerja bahkan dalam blok tanpa secara eksplisit memungkinkan ekspansi tertunda.
Joey
5
Hanya untuk sedikit meningkatkan jawaban Anda ... Anda tidak perlu secara eksplisit menyarang pernyataan "jika" ... Anda hanya dapat "rantai" mereka, seperti yang ditunjukkan Dave Jarvis di bawah ini
JoelFan
Jangan meninggalkan ruang apa pun setelah himpunan = benar atau hal yang anggun tidak berfungsi. Itu akan menyimpan nilai "true" dalam variabel ...
Roland Pihlakas
1
Kondisi 'atau' yang Anda gambarkan adalah apik dan berfungsi bagus untuk rentang angka, tetapi bagaimana jika saya membandingkan 2 nilai independen, dan bukan rentang? Misalnya, jika file ini ada atau nama file == ""
bakoyaro
1
@bakoyaro, Anda dapat menggunakan kondisi apa pun untuk menyetel res menjadi true, termasuk yang Anda sebutkan.
paxdiablo
69
The IFpernyataan tidak mendukung operator logika ( ANDdan OR), Cascading IFpernyataan membuat hubungannya implisit.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Jika File1.DatdanFile1.Dat yang ada kemudian melompat label FILE12_EXIST_LABEL.
Hukum De Morgan memungkinkan kita untuk mengubah disjunctions ("OR") menjadi padanan logis hanya menggunakan konjungsi ("AND") dan negations ("NOT"). Ini berarti kita dapat menghubungkan disjungsi ("OR") ke satu baris.
Ini berarti jika nama adalah "Yakko" atau "Wakko" atau "Dot", maka gema "Warner brother or sister".
set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Warner brother or sister
Ini adalah versi lain dari contoh "OR" paxdiablo, tetapi kondisinya terikat pada satu baris. (Perhatikan bahwa kebalikan dari leqadalah gtr, dan kebalikan dari geqadalah lss.)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Athul Prakash (usia 16 pada saat itu) memberikan ide logis tentang bagaimana menerapkan tes OR dengan meniadakan kondisi dalam pernyataan IF dan kemudian menggunakan klausa ELSE sebagai lokasi untuk meletakkan kode yang memerlukan eksekusi. Saya berpikir bahwa ada dua klausa lain yang biasanya diperlukan karena ia menyarankan untuk menggunakan dua pernyataan IF, sehingga kode yang dieksekusi perlu ditulis dua kali . Namun, jika GOTO digunakan untuk melewati kode yang diperlukan, alih-alih menulis klausa ELSE, kode untuk eksekusi hanya perlu ditulis satu kali .
Berikut adalah contoh yang dapat diuji tentang bagaimana saya akan menerapkan logika negatif Athul Prakash untuk membuat OR .
Dalam contoh saya, seseorang diizinkan untuk mengemudikan tank jika mereka memiliki lisensi tank ATAU mereka melakukan dinas militer mereka . Masukkan benar atau salah pada dua perintah dan Anda akan dapat melihat apakah logika memungkinkan Anda untuk menggerakkan tangki.
@ECHO OFF
@SET /p tanklicence=tanklicence:
@SET /p militaryservice=militaryservice:
IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done
ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice%
:done
PAUSE
Jika Anda tertarik untuk menulis if+AND / ORdalam satu pernyataan, maka tidak ada satupun. Namun, Anda masih dapat mengelompokkan ifdengan &&/ ||dan (/ )pernyataan untuk mencapai yang Anda inginkan dalam satu baris tanpa variabel tambahan dan tanpa if-elseduplikasi blok ( echoperintah tunggal untuk TRUEdan FALSEkode bagian):
@echo off
setlocal
set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND
echo.
set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR
exit /b 0
:IF_OR
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+
exit /b 0
:IF_AND
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE-
exit /b 0
Nah, jika Anda dapat melakukan operasi 'DAN' pada pernyataan if menggunakan nested 'if's (rujuk jawaban sebelumnya), maka Anda dapat melakukan hal yang sama dengan' jika tidak 'untuk melakukan operasi' atau '.
Jika Anda belum mendapatkan idenya, baca terus. Jika tidak, jangan buang waktu Anda dan kembali ke pemrograman.
Sama seperti 'jika puas hanya ketika semua kondisi benar, bersarang' jika tidak puas hanya ketika semua kondisi salah. Ini mirip dengan apa yang ingin Anda lakukan dengan operan 'atau', bukan?
Bahkan ketika salah satu kondisi dalam bersarang 'jika tidak' benar, seluruh pernyataan tetap tidak puas. Oleh karena itu, Anda dapat menggunakan negasi 'jika berturut-turut dengan mengingat bahwa isi pernyataan kondisi harus menjadi apa yang ingin Anda lakukan jika semua kondisi bersarang Anda salah. Tubuh yang sebenarnya ingin Anda berikan harus berada di bawah pernyataan lain.
Dan jika Anda masih tidak mendapatkan inti masalahnya, maaf, saya 16 dan itu yang terbaik yang bisa saya lakukan untuk menjelaskan.
x = 2 atau x = 3 =>! ! (x = 2 atau x = 3) =>! (x! = 2 dan x! = 3) Saya tidak berpikir Anda dapat meniadakan keseluruhan jika struktur untuk menerapkan operator luar "tidak" yang diperlukan. Sudah 3 tahun, @ Athul-prakash, pikiran?
Azeroth2b
1
Ini semudah yang berikut ini:
DAN> jika + jika
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
ATAU> jika // jika
set BOTH=0
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1
if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something*
if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something*
Saya tahu bahwa ada jawaban lain, tetapi saya pikir tambang itu lebih sederhana, jadi lebih mudah dimengerti. Semoga ini bisa membantu Anda! ;)
Alternatifnya adalah mencari shell unix yang memang memberi Anda operator logis dan banyak lagi. Anda bisa mendapatkan implementasi win32 asli dari shell Bourne di sini jika Anda tidak ingin menggunakan rute cygwin. Pesta asli dapat ditemukan di sini . Saya cukup yakin Anda bisa dengan mudah mencari alternatif bagus lain seperti zsh atau tcsh.
Jika Anda akan melalui upaya menggunakan shell yang berbeda, setidaknya pergilah dengan PowerShell: microsoft.com/powershell
Eclipse
17
Ada banyak shell yang lebih baik daripada DOS. Alasan mengapa saya akan menggunakan file bat DOS adalah karena tidak memerlukan alat eksternal. Jika Anda memiliki pelanggan yang perlu mengotomatisasi sesuatu yang sederhana, apakah Anda benar-benar ingin mereka harus menginstal alat khusus (cygwin, perl, PowerShell, dll) ketika file BAT sudah cukup?
Mark Lakata
3
BAT cukup sering terjadi. 90% dari skrip shell unix ppl tulis bukan shell murni tetapi dengan banyak coreutils, sed, awk dll panggilan. GNU telah mengimplementasikan barang UNIX di OS lain, termasuk Windows. Jadi lihat cmd.exe getgnuwin32.sourceforge.net ini / bash / zsh plus ini harus cukup pada sebagian besar tugas. Tidak ada alasan untuk mempelajari apa yang disebut PowerShell jika Anda memiliki pengalaman BAT / UNIX Shell
MeaCulpa
0
Hanya bagian ATAU yang rumit, tetapi dengan ekspresi boolean umum yang mengandung BUKAN ATAU DAN satu-satunya solusi yang bagus adalah ini:
REM if A == B OR C == C then yes
(call :strequ A B || call :strequ C C) && echo yes
exit /b
:strequ
if "%1" == "%2" exit /b 0
exit /b 1
Jawaban:
Anda dapat melakukannya
and
dengan kondisi bersarang:atau:
Anda dapat melakukannya
or
dengan variabel terpisah:sumber
set res=
atauset res=1
kemudianif defined res
yang sedikit lebih kuat terhadap kesalahan ketik dan bekerja bahkan dalam blok tanpa secara eksplisit memungkinkan ekspansi tertunda.The
IF
pernyataan tidak mendukung operator logika (AND
danOR
), CascadingIF
pernyataan membuat hubungannya implisit.Jika
File1.Dat
danFile1.Dat
yang ada kemudian melompat labelFILE12_EXIST_LABEL
.Lihat juga:
IF /?
sumber
Hukum De Morgan memungkinkan kita untuk mengubah disjunctions ("OR") menjadi padanan logis hanya menggunakan konjungsi ("AND") dan negations ("NOT"). Ini berarti kita dapat menghubungkan disjungsi ("OR") ke satu baris.
Ini berarti jika nama adalah "Yakko" atau "Wakko" atau "Dot", maka gema "Warner brother or sister".
Ini adalah versi lain dari contoh "OR" paxdiablo, tetapi kondisinya terikat pada satu baris. (Perhatikan bahwa kebalikan dari
leq
adalahgtr
, dan kebalikan darigeq
adalahlss
.)sumber
Contoh berikut menunjukkan cara membuat pernyataan AND (digunakan untuk mengatur variabel atau termasuk parameter untuk perintah).
Untuk memulai Notepad dan tutup jendela CMD:
Untuk mengatur variabel x, y, dan z ke nilai jika variabel 'a' sama dengan bla.
Semoga itu bisa membantu!
sumber
ATAU sedikit rumit, tetapi tidak terlalu rumit. Berikut ini sebuah contoh
sumber
Athul Prakash (usia 16 pada saat itu) memberikan ide logis tentang bagaimana menerapkan tes OR dengan meniadakan kondisi dalam pernyataan IF dan kemudian menggunakan klausa ELSE sebagai lokasi untuk meletakkan kode yang memerlukan eksekusi. Saya berpikir bahwa ada dua klausa lain yang biasanya diperlukan karena ia menyarankan untuk menggunakan dua pernyataan IF, sehingga kode yang dieksekusi perlu ditulis dua kali . Namun, jika GOTO digunakan untuk melewati kode yang diperlukan, alih-alih menulis klausa ELSE, kode untuk eksekusi hanya perlu ditulis satu kali .
Berikut adalah contoh yang dapat diuji tentang bagaimana saya akan menerapkan logika negatif Athul Prakash untuk membuat OR .
Dalam contoh saya, seseorang diizinkan untuk mengemudikan tank jika mereka memiliki lisensi tank ATAU mereka melakukan dinas militer mereka . Masukkan benar atau salah pada dua perintah dan Anda akan dapat melihat apakah logika memungkinkan Anda untuk menggerakkan tangki.
sumber
Jika Anda tertarik untuk menulis
if
+AND
/OR
dalam satu pernyataan, maka tidak ada satupun. Namun, Anda masih dapat mengelompokkanif
dengan&&
/||
dan(
/)
pernyataan untuk mencapai yang Anda inginkan dalam satu baris tanpa variabel tambahan dan tanpaif-else
duplikasi blok (echo
perintah tunggal untukTRUE
danFALSE
kode bagian):Output :
Triknya ada di
type
perintah yang menjatuhkan / mengaturerrorlevel
dan menangani jalan ke perintah berikutnya.sumber
Coba operan negasi - 'tidak'!
Nah, jika Anda dapat melakukan operasi 'DAN' pada pernyataan if menggunakan nested 'if's (rujuk jawaban sebelumnya), maka Anda dapat melakukan hal yang sama dengan' jika tidak 'untuk melakukan operasi' atau '.
Jika Anda belum mendapatkan idenya, baca terus. Jika tidak, jangan buang waktu Anda dan kembali ke pemrograman.
Sama seperti 'jika puas hanya ketika semua kondisi benar, bersarang' jika tidak puas hanya ketika semua kondisi salah. Ini mirip dengan apa yang ingin Anda lakukan dengan operan 'atau', bukan?
Bahkan ketika salah satu kondisi dalam bersarang 'jika tidak' benar, seluruh pernyataan tetap tidak puas. Oleh karena itu, Anda dapat menggunakan negasi 'jika berturut-turut dengan mengingat bahwa isi pernyataan kondisi harus menjadi apa yang ingin Anda lakukan jika semua kondisi bersarang Anda salah. Tubuh yang sebenarnya ingin Anda berikan harus berada di bawah pernyataan lain.
Dan jika Anda masih tidak mendapatkan inti masalahnya, maaf, saya 16 dan itu yang terbaik yang bisa saya lakukan untuk menjelaskan.
sumber
Ini semudah yang berikut ini:
DAN> jika + jika
ATAU> jika // jika
Saya tahu bahwa ada jawaban lain, tetapi saya pikir tambang itu lebih sederhana, jadi lebih mudah dimengerti. Semoga ini bisa membantu Anda! ;)
sumber
Alternatifnya adalah mencari shell unix yang memang memberi Anda operator logis dan banyak lagi. Anda bisa mendapatkan implementasi win32 asli dari shell Bourne di sini jika Anda tidak ingin menggunakan rute cygwin. Pesta asli dapat ditemukan di sini . Saya cukup yakin Anda bisa dengan mudah mencari alternatif bagus lain seperti zsh atau tcsh.
K
sumber
Hanya bagian ATAU yang rumit, tetapi dengan ekspresi boolean umum yang mengandung BUKAN ATAU DAN satu-satunya solusi yang bagus adalah ini:
sumber
Sedikit modifikasi pada jawaban Andry, mengurangi perintah tipe rangkap:
sumber