Di Windows, bagaimana Anda mengakses argumen yang dilewati ketika file batch dijalankan?
Sebagai contoh, katakanlah saya memiliki program bernama hello.bat
. Ketika saya masuk hello -a
pada baris perintah Windows, bagaimana saya membiarkan program saya tahu bahwa -a
itu dilewatkan sebagai argumen?
windows
batch-file
cmd
parameters
arguments
Seseorang
sumber
sumber
Jawaban:
Seperti yang telah dikatakan orang lain, parameter yang melewati baris perintah dapat diakses dalam file batch dengan notasi
%1
ke%9
. Ada juga dua token lain yang dapat Anda gunakan:%0
adalah nama (file file) yang dapat dieksekusi sebagaimana ditentukan dalam baris perintah .%*
adalah semua parameter yang ditentukan dalam baris perintah - ini sangat berguna jika Anda ingin meneruskan parameter ke program lain.Ada juga banyak teknik penting yang harus diperhatikan selain hanya cara mengakses parameter.
Memeriksa apakah suatu parameter telah dilewati
Ini dilakukan dengan konstruksi seperti
IF "%~1"==""
, yang benar jika dan hanya jika tidak ada argumen yang disahkan sama sekali. Perhatikan karakter tilde yang menyebabkan tanda kutip sekitarnya dihapus dari nilai%1
; tanpa tilde, Anda akan mendapatkan hasil yang tidak terduga jika nilai tersebut mencakup tanda kutip ganda, termasuk kemungkinan kesalahan sintaksis.Menangani lebih dari 9 argumen (atau hanya membuat hidup lebih mudah)
Jika Anda perlu mengakses lebih dari 9 argumen, Anda harus menggunakan perintah
SHIFT
. Perintah ini menggeser nilai semua argumen satu tempat, sehingga%0
mengambil nilai%1
,%1
mengambil nilai%2
, dll.%9
Mengambil nilai argumen kesepuluh (jika ada), yang tidak tersedia melalui variabel apa pun sebelum memanggilSHIFT
(masukkan perintahSHIFT /?
untuk lebih banyak opsi).SHIFT
juga berguna ketika Anda ingin dengan mudah memproses parameter tanpa mengharuskan mereka disajikan dalam urutan tertentu. Misalnya, skrip dapat mengenali bendera-a
dan-b
dalam urutan apa pun. Cara yang baik untuk mengurai baris perintah dalam kasus seperti ini adalahSkema ini memungkinkan Anda untuk mengurai baris perintah yang cukup rumit tanpa menjadi gila.
Substitusi parameter batch
Untuk parameter yang mewakili nama file, shell menyediakan banyak fungsi yang terkait dengan bekerja dengan file yang tidak dapat diakses dengan cara lain. Fungsi ini diakses dengan konstruk yang dimulai dengan
%~
.Misalnya, untuk mendapatkan ukuran file yang diteruskan sebagai argumen gunakan
Untuk mendapatkan jalur direktori tempat file batch diluncurkan (sangat berguna!) Dapat Anda gunakan
Anda dapat melihat berbagai kemampuan ini dengan mengetikkan
CALL /?
prompt perintah.sumber
"name=John"
akan menjadiname John
selama exe. Solusinya adalah dengan mengelilingi dengan tanda kutip tunggal,'"name=John"'
CALL /?
!? Di sini saya telah bertabrakan dengan Google sepanjang waktu.Menggunakan parameter dalam file batch:% 0 dan% 9
File batch dapat merujuk pada kata-kata yang dikirimkan sebagai parameter dengan token:
%0
to%9
.parameter yang diteruskan pada commandline harus berupa karakter alfanumerik dan dibatasi oleh spasi. Karena
%0
ini adalah nama program seperti yang dipanggil, dalam DOS%0
akan kosong untuk AUTOEXEC.BAT jika dimulai saat boot.Contoh:
Masukkan perintah berikut dalam file batch yang disebut
mybatch.bat
:Meminta file batch seperti ini:
mybatch john billy
akan menampilkan:Dapatkan lebih dari 9 parameter untuk file batch, gunakan:% *
Token Bintang Persen
%*
berarti "sisa parameter". Anda bisa menggunakan for for untuk mengambilnya, seperti yang didefinisikan di sini:http://www.robvanderwoude.com/parameters.php
Catatan tentang pembatas untuk parameter batch
Beberapa karakter dalam parameter baris perintah diabaikan oleh file batch, tergantung pada versi DOS, apakah mereka "lolos" atau tidak, dan sering kali tergantung pada lokasi mereka di baris perintah:
sumber
File Batch secara otomatis mengirimkan teks setelah program selama variabel-variabelnya adalah untuk ditugaskan. Mereka lulus agar mereka dikirim; misal% 1 akan menjadi string pertama yang dikirim setelah program dipanggil, dll.
Jika Anda memiliki Hello.bat dan isinya adalah:
dan Anda memanggil batch dalam perintah via
Anda harus menerima pesan ini kembali:
Halo, APerson241 terima kasih telah menjalankan file batch ini (01/11/2013)
sumber
@ Jon
:parse
/:endparse
skema adalah awal yang baik, dan dia memiliki rasa syukur saya untuk lulus awal, tetapi jika Anda berpikir bahwa sistem Windows menyiksa batch yang akan membiarkan Anda pergi mudah ... dengan baik, teman saya, Anda berada dalam untuk shock. Saya telah menghabiskan sepanjang hari dengan iblis ini, dan setelah banyak penelitian dan percobaan yang menyakitkan akhirnya saya berhasil sesuatu yang berguna untuk utilitas kehidupan nyata.Mari kita katakan bahwa kita ingin mengimplementasikan suatu utilitas
foobar
. Itu membutuhkan perintah awal. Ini memiliki parameter opsional--foo
yang mengambil nilai opsional (yang tidak bisa menjadi parameter lain, tentu saja); jika nilai tidak ada, defaultnya adalahdefault
. Ini juga memiliki parameter opsional--bar
yang mengambil nilai yang diperlukan . Terakhir dapat mengambil bendera--baz
tanpa nilai yang diizinkan. Oh, dan parameter ini bisa datang dalam urutan apa pun.Dengan kata lain, tampilannya seperti ini:
Rumit? Tidak, itu kelihatannya tipikal utilitas kehidupan nyata. (
git
siapa pun?)Tanpa basa-basi lagi, berikut adalah solusinya:
Ya, itu seburuk itu. Lihat posting saya yang serupa di https://stackoverflow.com/a/50653047/421049 , di mana saya memberikan lebih banyak analisis tentang apa yang terjadi dalam logika, dan mengapa saya menggunakan konstruksi tertentu.
Mengerikan. Sebagian besar dari itu harus saya pelajari hari ini. Dan itu menyakitkan.
sumber
Gunakan variabel yaitu
.BAT
variabel dan dipanggil%0
ke%9
sumber