Apakah ada cara untuk menulis pernyataan bersyarat JIKA ATAU JIKA di file batch windows?
Sebagai contoh:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
windows
batch-file
if-statement
cmd
conditional
Mechaflash
sumber
sumber
IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE
. Aku digunakan untuk mendefinisikanSET AND=IF
dan kemudian menulis:IF cond1 %AND% cond2 ECHO BOTH ARE TRUE
.Jawaban:
Solusi zmbq bagus, tetapi tidak dapat digunakan dalam semua situasi, seperti di dalam blok kode seperti loop FOR DO (...).
Alternatifnya adalah dengan menggunakan variabel indikator. Lakukan inisialisasi agar tidak ditentukan, lalu tentukan hanya jika salah satu kondisi ATAU benar. Kemudian gunakan IF DEFINED sebagai pengujian akhir - tidak perlu menggunakan ekspansi tertunda.
Anda dapat menambahkan logika ELSE IF yang digunakan arasmussen dengan alasan bahwa ia mungkin bekerja sedikit lebih cepat jika kondisi 1 benar, tetapi saya tidak pernah repot.
Tambahan - Ini adalah pertanyaan duplikat dengan jawaban yang hampir identik dengan Menggunakan ATAU dalam pernyataan IF WinXP Batch Script
Adendum terakhir - Saya hampir lupa teknik favorit saya untuk menguji apakah variabel adalah salah satu dari daftar nilai tidak peka huruf besar / kecil. Inisialisasi variabel uji yang berisi daftar nilai yang dapat diterima yang dipisahkan, lalu gunakan cari dan ganti untuk menguji apakah variabel Anda ada dalam daftar. Ini sangat cepat dan menggunakan kode minimal untuk daftar yang sangat panjang. Itu memang membutuhkan perluasan yang tertunda (atau trik CALL %% VAR %%). Juga tes ini tidak sensitif terhadap kasus.
Di atas bisa gagal jika VAR berisi
=
, jadi pengujian ini bukan bukti yang bodoh.Jika melakukan pengujian dalam blok di mana ekspansi tertunda diperlukan untuk mengakses nilai VAR saat ini
UNTUK opsi seperti "delims =" mungkin diperlukan bergantung pada nilai yang diharapkan dalam VAR
Strategi di atas dapat dibuat dapat diandalkan bahkan
=
dalam VAR dengan menambahkan lebih banyak kode.Tapi sekarang kami kehilangan kemampuan untuk menyediakan klausa ELSE kecuali kami menambahkan variabel indikator. Kode mulai terlihat sedikit "jelek", tetapi saya pikir ini adalah metode yang dapat diandalkan dengan kinerja terbaik untuk pengujian jika VAR adalah salah satu dari sejumlah pilihan yang tidak peka huruf besar / kecil.
Akhirnya ada versi yang lebih sederhana yang menurut saya sedikit lebih lambat karena harus melakukan satu IF untuk setiap nilai. Aacini memberikan solusi ini dalam komentar ke jawaban yang diterima di tautan yang disebutkan sebelumnya
Daftar nilai tidak boleh menyertakan * atau? karakter, dan nilai dan
%VAR%
tidak boleh mengandung tanda kutip. Kutipan menyebabkan masalah jika%VAR%
juga berisi spasi atau karakter khusus seperti^
,&
dll. Satu batasan lain dengan solusi ini adalah tidak menyediakan opsi untuk klausa ELSE kecuali Anda menambahkan variabel indikator. Keuntungannya bisa peka huruf besar kecil atau tidak peka tergantung pada ada atau tidaknya/I
opsi IF .sumber
Saya rasa tidak. Cukup gunakan dua IF dan GOTO dengan label yang sama:
sumber
ECHO Didn't find it
bahkan jika memang menemukannya.Terima kasih untuk posting ini, itu sangat membantu saya.
Entah apakah itu dapat membantu tetapi saya memiliki masalah dan terima kasih kepada Anda, saya menemukan apa yang menurut saya adalah cara lain untuk menyelesaikannya berdasarkan persamaan boolean ini:
"A atau B" sama dengan "bukan (bukan A dan bukan B)"
Jadi:
Menjadi:
sumber
"FOR" sederhana dapat digunakan dalam satu baris untuk menggunakan kondisi "atau":
Diterapkan ke kasus Anda:
sumber
Meskipun pertanyaan ini sedikit lebih tua:
Jika Anda ingin menggunakan
if cond1 or cond 2
- Anda tidak boleh menggunakan loop rumit atau hal-hal seperti itu.Sederhana menyediakan keduanya
ifs
setelah satu sama lain digabungkan dengangoto
- itu implisit atau.Tanpa pergi tetapi tindakan "di tempat", Anda dapat menjalankan tindakan 3 kali, jika SEMUA kondisi cocok.
sumber
Tidak ada
IF <arg> OR
atauELIF
atauELSE IF
dalam Batch, namun ...Cobalah menumpuk IF lainnya di dalam IF sebelumnya.
sumber
Dimungkinkan untuk menggunakan fungsi, yang mengevaluasi logika OR dan mengembalikan satu nilai.
sumber
&& ... || ...
sintaksis yang nyaman secara langsung sebagai gantiIF ... ELSE ...
pernyataan tambahan .Tujuannya bisa dicapai dengan menggunakan IF secara tidak langsung.
Di bawah ini adalah contoh ekspresi kompleks yang dapat ditulis dengan cukup ringkas dan logis dalam batch CMD, tanpa label dan GOTO yang tidak koheren.
Blok kode di antara tanda kurung () ditangani oleh CMD sebagai jenis subkulit (menyedihkan). Kode keluar apa pun yang keluar dari sebuah blok akan digunakan untuk menentukan nilai benar / salah yang dimainkan blok dalam ekspresi boolean yang lebih besar. Ekspresi boolean yang sangat besar dapat dibangun dengan blok kode ini.
Contoh sederhana
Setiap blok diselesaikan menjadi benar (yaitu ERRORLEVEL = 0 setelah pernyataan terakhir dalam blok telah dieksekusi) / salah, sampai nilai seluruh ekspresi telah ditentukan atau kontrol melompat keluar (misalnya melalui GOTO):
Contoh yang kompleks
Ini memecahkan masalah yang awalnya diangkat. Beberapa pernyataan mungkin dilakukan di setiap blok tetapi di || || || ekspresi lebih disukai singkat sehingga dapat dibaca semaksimal mungkin. ^ adalah karakter escape dalam batch CMD dan ketika ditempatkan di akhir baris, ia akan keluar dari EOL dan menginstruksikan CMD untuk terus membaca kumpulan pernyataan saat ini di baris berikutnya.
sumber
Itu untuk memeriksa apakah beberapa variabel bernilai sama. Ini untuk salah satu variabel.
Saya hanya memikirkan itu di luar kepala saya. Saya bisa lebih memadatkannya.
sumber
Saya menyadari pertanyaan ini sudah lama, tetapi saya ingin memposting solusi alternatif jika ada orang lain (seperti saya) yang menemukan utas ini saat memiliki pertanyaan yang sama. Saya dapat mengatasi kekurangan operator OR dengan menggemakan variabel dan menggunakan findstr untuk memvalidasi.
sumber
Meskipun jawaban dbenham cukup bagus, mengandalkan
IF DEFINED
dapat membuat Anda mendapat banyak masalah jika variabel yang Anda periksa bukan variabel lingkungan . Variabel skrip tidak mendapatkan perlakuan khusus ini.Meskipun ini mungkin tampak seperti beberapa BS tidak berdokumen yang menggelikan, melakukan kueri shell sederhana
IF
denganIF /?
mengungkapkan bahwa,Berkenaan dengan menjawab pertanyaan ini, adakah alasan untuk tidak hanya menggunakan bendera sederhana setelah serangkaian evaluasi? Itu sepertinya pemeriksaan paling fleksibel
OR
bagi saya, baik dalam hal logika dan keterbacaan yang mendasarinya. Sebagai contoh:Jelas, mereka dapat berupa evaluasi bersyarat apa pun, tetapi saya hanya membagikan beberapa contoh.
Jika Anda ingin memiliki semuanya dalam satu baris, secara tertulis, Anda dapat menggabungkannya dengan
&&
seperti:sumber
Tidak pernah ada untuk bekerja.
Saya menggunakan jika tidak ada g: xyz / what goto h: Lain xcopy c: current / files g: bu / current Ada pengubah / a dll. Tidak yakin yang mana. Laptop di toko. Dan komputer di kantor. Aku tidak di sana.
Tidak pernah mendapat file batch untuk bekerja di atas Windows XP
sumber
Alternatif yang jauh lebih cepat yang biasanya saya gunakan adalah sebagai berikut, yang saya bisa "atau" sejumlah kondisi acak yang dapat muat dalam ruang variabel
sumber
Menyadari ini adalah pertanyaan lama, tanggapan membantu saya menemukan solusi untuk menguji argumen baris perintah ke file batch; jadi saya ingin memposting solusi saya juga jika ada orang lain yang mencari solusi serupa.
Hal pertama yang harus saya tunjukkan adalah bahwa saya mengalami masalah dalam mendapatkan pernyataan IF ... ELSE untuk bekerja di dalam klausa FOR ... DO. Ternyata (terima kasih kepada dbenham karena secara tidak sengaja menunjukkan hal ini dalam contoh-contohnya) pernyataan ELSE tidak dapat dipisahkan dari baris penutup.
Jadi, alih-alih ini:
Yang mana preferensi saya untuk alasan keterbacaan dan estetika, Anda harus melakukan ini:
Sekarang pernyataan ELSE tidak kembali sebagai perintah yang tidak dikenali.
Akhirnya, inilah yang saya coba lakukan - saya ingin menyampaikan beberapa argumen ke file batch dalam urutan apa pun, mengabaikan kasus, dan melaporkan / gagal pada argumen yang tidak ditentukan yang diteruskan. Jadi, inilah solusi saya ...
Catatan, ini hanya akan melaporkan argumen pertama yang gagal. Jadi jika pengguna memberikan lebih dari satu argumen yang tidak dapat diterima, mereka hanya akan diberi tahu tentang yang pertama sampai argumen itu diperbaiki, lalu yang kedua, dll.
sumber