OS saya adalah Windows Vista. Saya perlu memiliki file ".bat" di mana saya perlu memeriksa apakah pengguna memasukkan parameter baris perintah atau tidak. Jika tidak, maka jika parameternya sama dengan -b
maka saya akan melakukan sesuatu jika tidak, saya akan menandai "Input tidak valid". Jika pengguna tidak memasukkan parameter baris perintah apa pun maka saya akan melakukan sesuatu. Saya telah membuat file .bat berikut. Ini berfungsi untuk -b
dan tidak sama dengan -b
kasus - tetapi gagal ketika pengguna tidak memberikan parameter baris perintah apa pun.
Saya selalu mendapatkan kesalahan:
GOTO was unexpected at this time.
Adakah yang bisa memberi tahu saya apa yang saya lakukan salah di sini?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
windows
file
batch-file
cmd
javauser71
sumber
sumber
GOTO BLANK
baris) ke duaIF
pernyataan lainnya, apakah itu memperbaiki masalah?Jawaban:
Anda perlu memeriksa apakah parameternya kosong:
if "%~1"=="" goto blank
Setelah Anda selesai melakukannya, lakukan jika / else aktifkan -b:
if "%~1"=="-b" (goto specific) else goto unknown
Mengitari parameter dengan tanda kutip mempermudah pemeriksaan hal-hal seperti parameter kosong / kosong / hilang. "~" memastikan tanda kutip ganda dihapus jika ada di argumen baris perintah.
sumber
File
, dalam hal ini Anda harus memeriksa sajaexist
ataunot exist
. Inilah mengapa argumen Anda harus didefinisikan dengan baik, atau cukup gunakan PowerShell atau vbScript (jika Anda berusia 80-an ..)run.bat "a b"
."%1"==""
crash jika arg memiliki spasi. Lihat stackoverflow.com/a/46942471Lihat http://ss64.com/nt/if.html untuk mendapatkan jawaban; perintahnya
IF [%1]==[] GOTO NO_ARGUMENT
atau serupa.sumber
"%1"==""
. Saya harus menjelaskannya dalam jawaban saya sendiri.foo.bat "1st parameter" 2nd_param
. Lihat stackoverflow.com/questions/2541767/…[%1]==[-b]
tidak akan cocok jika arg dikutip. Contohrun.bat "-b"
. Lihat stackoverflow.com/a/46942471Jawaban singkatnya - gunakan tanda kurung siku:
atau (ketika Anda perlu menangani argumen yang dikutip, lihat Edit di bawah):
Mengapa? Anda mungkin bertanya. Nah, seperti yang dikatakan Jeremiah Willcock: http://ss64.com/nt/if.html - mereka menggunakannya! Oke, tapi apa yang salah dengan kutipannya?
Sekali lagi, jawaban singkatnya: kutipan itu "ajaib" - terkadang tanda kutip ganda (ganda) diubah menjadi tanda kutip tunggal (ganda). Dan mereka harus cocok, sebagai permulaan.
Pertimbangkan skrip kecil ini:
Mari kita uji:
Sepertinya berhasil. Tapi sekarang, mari beralih ke gigi kedua:
Boom Ini tidak bernilai benar, juga tidak bernilai salah. Script MATI. Jika Anda seharusnya mematikan reaktor di suatu tempat, ya - sial. Anda sekarang akan mati seperti Harry Daghlian.
Anda mungkin berpikir - Oke, argumen tidak boleh berisi tanda kutip. Jika mereka melakukannya, ini terjadi. Salah Ini beberapa penghiburan:
Oh ya. Jangan khawatir - terkadang ini akan berhasil.
Mari coba skrip lain:
Anda dapat menguji sendiri, apakah itu berfungsi dengan baik untuk kasus di atas. Ini logis - tanda kutip tidak ada hubungannya dengan tanda kurung, jadi tidak ada keajaiban di sini. Tapi bagaimana dengan membumbui args dengan tanda kurung?
Tidak beruntung disana. Tanda kurung tidak bisa mencekik
cmd.exe
parser.Mari kita kembali ke kutipan jahat sejenak. Masalahnya ada di sana, ketika argumen diakhiri dengan kutipan:
Bagaimana jika saya lulus hanya:
Skrip tidak akan berjalan sama sekali. Sama untuk
args.bat
:Tapi apa yang saya dapatkan, ketika jumlah
"
-karakter "cocok" (yaitu - genap), dalam kasus seperti itu:BAGUS - Saya harap Anda mempelajari sesuatu tentang bagaimana
.bat
file membagi argumen baris perintah mereka (PETUNJUK: * Ini tidak persis seperti di bash). Argumen di atas mengandung spasi. Tetapi tanda kutip tidak dihapus secara otomatis.Dan argq? Bagaimana reaksinya terhadap itu? Dapat diprediksi:
Jadi - pikirkan sebelum Anda mengatakan: "Tahu apa? Gunakan saja tanda kutip. [Karena, bagi saya, ini terlihat lebih bagus]".
Edit
Baru-baru ini, ada komentar tentang jawaban ini - yah, tanda kurung siku "tidak dapat menangani" melewati argumen yang dikutip dan memperlakukannya seolah-olah tidak dikutip.
Sintaksnya:
Bukan beberapa keunggulan yang baru ditemukan dari tanda kutip ganda, tetapi tampilan fitur rapi dari tanda kutip dari variabel argumen, jika karakter pertama dan terakhir adalah tanda kutip ganda.
"Teknologi" ini bekerja dengan baik dengan tanda kurung siku:
Ini adalah hal yang berguna untuk menunjukkan hal ini, jadi saya juga mendukung jawaban baru tersebut.
Terakhir, penggemar kutipan ganda, apakah argumen formulir tersebut
""
ada di buku Anda, atau kosong? Hanya askin ';)sumber
[%1]==[-b]
tidak akan cocok jika arg dikutip seperti inirun.bat "-b"
. Lihat stackoverflow.com/a/46942471[%1]==[-b]
dan"%1"=="-b"
sama untuk win 98 dan skrip batch sistem MS / PC-DOS sebelumnya. Sejak win 2000 / NT memperkenalkan sintaks diif "%~1"=="-b"
mana tanda kutip ganda memiliki arti khusus yang merupakan cara Anda harus membuat kode skrip karena memberikan perlindungan yang lebih kuat. Tanda kutip ganda menghilangkan arti karakter khusus (coba & | dan% karakter di baris perintah Anda). 99,9% contoh bekerja dengan sintaks tanda kutip ganda - contoh Andaargq bla2" "bla3
hanya kasus untuk membenarkan tanda kurung siku. Tanda kutip ganda yang disematkan adalah resep untuk bencana - katakan sajacmd
shell. Di sistem lain Anda terkadang dapat mengutip semuanya, termasuk karakter NUL. ( stackoverflow.com/questions/2730732/… ) - pertanyaan ini hanya menunjukkan, Anda perlu menggunakan beberapa program eksternal.Selain jawaban lain, yang saya langgan, Anda dapat mempertimbangkan untuk menggunakan
/I
sakelarIF
perintah.mungkin bisa membantu jika Anda ingin memberikan fleksibilitas tidak peka huruf besar / kecil kepada pengguna Anda untuk menentukan parameter.
sumber
Anda membandingkan string. Jika argumen dihilangkan,
%1
diperluas menjadi kosong sehingga perintah menjadiIF =="-b" GOTO SPECIFIC
misalnya (yang merupakan kesalahan sintaks). Bungkus string Anda dengan tanda kutip (atau tanda kurung siku).sumber
Sebenarnya, semua jawaban lainnya memiliki kekurangan. Cara paling andal adalah:
Penjelasan detail:
Penggunaan
"%1"=="-b"
akan gagal total jika memberikan argumen dengan spasi dan tanda kutip. Ini adalah metode yang paling tidak dapat diandalkan.Menggunakan
[%1]==[-b]
lebih baik karena tidak akan crash dengan spasi dan tanda kutip, tetapi tidak akan cocok jika argumen diapit oleh tanda kutip.Menggunakan
"%~1"=="-b"
adalah yang paling andal.%~1
akan menghapus kutipan di sekitarnya jika ada. Jadi ini bekerja dengan dan tanpa tanda kutip, dan juga tanpa argumen.sumber
IF [%~1]==[]
- ini berfungsi, dan bahkan menangani"-b"
. Anda hanya perlu berpikir di dalam kotak, erm, persegi [tanda kurung].Saya telah berjuang baru-baru ini dengan penerapan sakelar parameter kompleks dalam file batch jadi inilah hasil penelitian saya. Tidak ada jawaban yang diberikan sepenuhnya aman, contoh:
"%1"=="-?"
tidak akan cocok jika parameter diapit tanda kutip (diperlukan untuk nama file, dll.) atau akan mogok jika parameter dalam tanda kutip dan memiliki spasi (sekali lagi sering terlihat dalam nama file)Kombinasi apa pun dengan tanda kurung siku
[%1]==[-?]
atau[%~1]==[-?]
akan gagal jika parameter memiliki spasi dalam tanda kutip:Solusi teraman yang diusulkan
"%~1"=="-?"
akan macet dengan parameter kompleks yang menyertakan teks di luar tanda kutip dan teks dengan spasi di dalam tanda kutip:Satu-satunya cara untuk memastikan semua skenario di atas tercakup adalah dengan menggunakan EnableDelayedExpansion dan meneruskan parameter dengan referensi (bukan berdasarkan nilai) menggunakan variabel. Kemudian bahkan skenario yang paling kompleks pun akan bekerja dengan baik:
sumber
Batch Windows memiliki kata kunci DEFINED untuk melakukan ini.
sumber