Dalam file batch DOS kita hanya dapat memiliki 1 baris if badan pernyataan? Saya rasa saya menemukan tempat yang dapat saya gunakan ()
untuk blok if seperti yang {}
digunakan dalam bahasa pemrograman mirip C, tetapi tidak mengeksekusi pernyataan ketika saya mencoba ini. Tidak ada pesan kesalahan juga. Ini kode saya:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Anehnya, baik "GP Manager up" maupun "GP Manager is down" tidak dicetak saat saya menjalankan file batch.
if-statement
batch-file
Hugh Darling
sumber
sumber
Jawaban:
Anda memang bisa membuat blok pernyataan untuk dieksekusi setelah kondisional. Tapi Anda memiliki sintaks yang salah. Tanda kurung harus digunakan persis seperti yang ditunjukkan:
Namun, saya tidak percaya bahwa ada sintaks bawaan untuk
else-if
pernyataan. Sayangnya, Anda perlu membuat blokif
pernyataan bertingkat untuk menanganinya.Kedua,
%GPMANAGER_FOUND% == true
tes itu tampak sangat mencurigakan bagi saya. Saya tidak tahu apa variabel lingkungan diatur atau bagaimana Anda mengaturnya, tetapi saya sangat meragukan bahwa kode yang Anda tunjukkan akan menghasilkan hasil yang Anda cari.Kode contoh berikut berfungsi dengan baik untuk saya:
Harap perhatikan beberapa detail spesifik tentang kode sampel saya:
@echo off
agar tidak melihat semua pernyataan yang dicetak ke konsol saat mereka mengeksekusi, dan sebagai gantinya hanya melihat output dari yang secara khusus dimulaiecho
.ERRORLEVEL
variabel built-in hanya sebagai pengujian. Baca lebih lanjut di sinisumber
ERRORLEVEL
bukanlah jawaban untuk masalahnya. Saya hanya memposting contoh sintaks yang tepat. Bentuk mana pun dapat diterima dalam kasus ini, seperti yang akan dilakukanif 0 == 0
atau ekspresi sepele lainnya. Namun memang, pastikan Anda memahami perbedaan antara variabel lingkungan%ERRORLEVEL%
dan internalERRORLEVEL
prosesor perintah. Raymond Chen menjelaskannya dengan baik di sini di blog ini .REM This is a comment (or so I thought)
ke dalamIF
blok akan mengacaukan Anda.IF %somevar%==example_string2
harus selalu menjadi kode sehingga operan menyelesaikan menjadiIF "value_of_somevar"=="example_string2
"untuk menghindari karakter khusus di salah satu operan string yang menyebabkan kesalahan sintaks dalamIF
pernyataan. Nilai yang Anda setel harus selalu dilakukan karenaset "somevar=value_of_somevar"
sintaks itu memungkinkan Anda untuk keluar dari karakter khusus dalam nilai variabel, Catatan bahwa saya tidak bermaksudset somevar="value_of_somevar"
Logikanya, jawaban Cody seharusnya berhasil. Namun saya tidak berpikir command prompt menangani blok kode secara logis. Untuk kehidupan saya, saya tidak bisa membuatnya berfungsi dengan baik dengan lebih dari satu perintah di dalam blok. Dalam kasus saya, pengujian ekstensif mengungkapkan bahwa semua perintah di dalam blok sedang di-cache, dan dijalankan secara bersamaan di akhir blok. Ini tentu saja tidak memberikan hasil yang diharapkan. Berikut adalah contoh yang terlalu disederhanakan:
Ini harus memberikan var3 dengan nilai berikut:
tetapi malah menghasilkan:
karena semua 3 perintah di-cache dan dijalankan secara bersamaan setelah keluar dari blok kode.
Saya dapat mengatasi masalah ini dengan menulis ulang blok if untuk hanya menjalankan satu perintah - goto - dan menambahkan beberapa label. Ini kikuk, dan saya tidak begitu menyukainya, tapi setidaknya berhasil.
sumber
set var3=!var1!_!var2!
Daripada goto mess, coba gunakan ampersand & atau double ampersand && (conditional to errorlevel 0) sebagai pemisah perintah.
Saya memperbaiki cuplikan skrip dengan trik ini, untuk meringkas, saya memiliki tiga file batch, satu yang memanggil dua lainnya setelah menemukan huruf mana yang telah ditetapkan oleh drive cadangan eksternal. Saya meninggalkan file pertama di drive eksternal utama sehingga panggilan ke rutin pencadangannya berfungsi dengan baik, tetapi panggilan ke yang kedua memerlukan perubahan drive aktif. Kode di bawah ini menunjukkan bagaimana saya memperbaikinya:
sumber
Saya menemukan artikel ini dalam hasil yang dikembalikan oleh pencarian yang terkait dengan perintah IF dalam file batch, dan saya tidak dapat menahan kesempatan untuk memperbaiki kesalahpahaman bahwa blok IF terbatas pada perintah tunggal. Berikut ini adalah sebagian dari skrip perintah Windows NT produksi yang berjalan setiap hari pada mesin tempat saya menulis balasan ini.
Mungkin blok dua atau lebih baris berlaku secara eksklusif untuk skrip perintah Windows NT (file .CMD), karena pencarian direktori skrip produksi dari aplikasi yang dibatasi untuk file batch sekolah lama (.BAT), mengungkapkan hanya blok satu perintah . Karena aplikasi telah menjalani perawatan yang diperpanjang (artinya saya tidak terlibat aktif dalam mendukungnya), saya tidak dapat mengatakan apakah itu karena saya tidak memerlukan lebih dari satu baris, atau saya tidak dapat membuatnya berfungsi.
Terlepas dari itu, jika yang terakhir benar, ada solusi sederhana; pindahkan beberapa baris ke file batch terpisah atau subrutin file batch. Saya tahu bahwa yang terakhir berfungsi di kedua jenis skrip.
sumber
Mungkin agak terlambat, tapi semoga bisa:
sumber