Di Unix saya bisa lari myscript '"test"'
dan saya akan mendapatkannya "test"
.
Di Windows cmd
saya dapatkan 'test'
.
Bagaimana cara melewatkan tanda kutip ganda sebagai parameter? Saya ingin tahu bagaimana melakukan ini secara manual dari cmd
jendela sehingga saya tidak perlu menulis program untuk menguji program saya.
myscript \"test\"
Jawaban:
Saya tidak dapat mereproduksi gejalanya dengan cepat: jika saya mencoba
myscript '"test"'
dengan file batchmyscript.bat
yang hanya berisi@echo.%1
atau bahkan@echo.%~1
, saya mendapatkan semua tanda kutip:'"test"'
Mungkin Anda dapat mencoba karakter melarikan diri
^
seperti inimyscript '^"test^"'
:?sumber
wscript
salah! Serahkan pada Windows :)cmd
.Cara lain untuk menghindari tanda kutip (meskipun mungkin tidak disukai), yang saya temukan digunakan di tempat-tempat tertentu adalah dengan menggunakan beberapa tanda kutip ganda . Untuk tujuan membuat kode orang lain terbaca, saya akan menjelaskan.
Berikut seperangkat aturan dasar:
program param1 param2 param 3
akan melewati empat parameter untukprogram.exe
:param1
,param2
,param
, dan3
.program one two "three and more"
akan melewati tiga parameter untukprogram.exe
:one
,two
, danthree and more
.hello"to the entire"world
bertindak sebagai salah satu parameter:helloto the entireworld
."Tim says, ""Hi!"""
akan bertindak sebagai satu parameter:Tim says, "Hi!"
Jadi, ada tiga jenis tanda kutip ganda yang berbeda: tanda kutip terbuka, tanda kutip penutup, dan tanda kutip yang bertindak sebagai teks biasa.
Inilah rincian baris terakhir yang membingungkan itu:
Dengan demikian, teks secara efektif menggabungkan empat kelompok karakter (satu tanpa ada, bagaimanapun):
Tim says,
adalah yang pertama, dibungkus untuk menghindari spasi"Hi!
adalah yang kedua, tidak dibungkus (tidak ada spasi)adalah yang ketiga, kelompok tanda kutip ganda yang tidak membungkus apapun
"
adalah yang keempat, kutipan penutup yang terbuka.Seperti yang Anda lihat, grup kutip ganda yang membungkus tidak ada yang masih diperlukan karena, tanpanya, kutip ganda berikut akan membuka grup kutip ganda alih-alih bertindak sebagai teks biasa.
Dari sini, harus dikenali bahwa oleh karena itu, di dalam dan di luar tanda kutip, tiga tanda kutip ganda bertindak sebagai tanda kutip ganda teks biasa yang tidak dapat dihindari:
akan mencetak
Tim said to him, "What's been happening lately?"
seperti yang diharapkan. Oleh karena itu, tiga tanda kutip selalu dapat digunakan dengan andal sebagai pelarian.Namun, dalam memahaminya, Anda mungkin memperhatikan bahwa empat kutipan di akhir dapat dikurangi menjadi hanya dua karena secara teknis menambahkan grup kutipan ganda kosong yang tidak perlu.
Berikut beberapa contoh untuk menutupnya:
Catatan terakhir: Saya tidak membaca semua ini dari tutorial mana pun - saya mendapatkan semuanya dengan bereksperimen. Oleh karena itu, penjelasan saya mungkin tidak benar secara internal. Meskipun demikian, semua contoh di atas mengevaluasi seperti yang diberikan, dengan demikian memvalidasi (tetapi tidak membuktikan) teori saya.
Saya menguji ini pada Windows 7, 64bit hanya menggunakan panggilan * .exe dengan parameter passing (bukan * .bat, tetapi saya kira itu berfungsi sama).
sumber
Coba ini:
"" escape to a single "di parameter.
sumber
myscript """test test"""
dan tidak berhasil (parameter pertama diserahkan sebagai"test
. Sebenarnya, Anda memerlukan tiga tanda kutip:myscript """"test test""
Meskipun demikian, kutipan ketiga di akhir dapat dilewati.char **argv
dari peluncur C saya ke proses lain menggunakan fungsi sepertispawn
atauexec
. Terima kasih. :-)Dokumen kedua yang dikutip oleh Peter Mortensen dalam komentarnya atas jawaban Codesmith membuat segalanya menjadi lebih jelas bagi saya. Dokumen itu ditulis oleh windowsinspired.com. Tautan berulang: Cara yang Lebih Baik Untuk Memahami Quoting dan Escaping dari Argumen Baris Perintah Windows .
Beberapa trial and error lebih lanjut mengarah pada pedoman berikut:
Hindari setiap kutipan ganda
"
dengan tanda sisipan^
. Jika Anda ingin karakter lain dengan arti khusus untuk perintah Windows shell (misalnya,<
,>
,|
,&
) harus ditafsirkan sebagai karakter biasa, bukan, lalu melarikan diri mereka dengan sebuah tanda sisipan, juga.Jika Anda ingin program Anda foo untuk menerima teks baris perintah
"a\"b c" > d
dan mengarahkan output ke file out.txt , kemudian memulai program Anda sebagai berikut dari perintah Windows shell:Jika foo menafsirkan
\"
sebagai tanda kutip ganda literal dan mengharapkan tanda kutip ganda yang tidak lolos untuk membatasi argumen yang menyertakan spasi, maka foo menafsirkan perintah tersebut sebagai menentukan satu argumena"b c
, satu argumen>
, dan satu argumend
.Jika sebaliknya foo menafsirkan tanda petik ganda
""
sebagai tanda petik ganda literal, maka mulailah program Anda sebagaiWawasan utama dari dokumen yang dikutip adalah bahwa, ke shell perintah Windows, tanda kutip ganda yang tidak dapat dihindarkan memicu peralihan antara dua kemungkinan status.
Beberapa trial and error lebih lanjut menyiratkan bahwa dalam keadaan awal, pengalihan (ke file atau pipa) dikenali dan tanda sisipan
^
lolos dari tanda kutip ganda dan tanda sisipan dihapus dari input. Di negara bagian lain, pengalihan tidak dikenali dan tanda sisipan tidak lolos dari tanda kutip ganda dan tidak dihapus. Mari kita lihat keadaan ini masing-masing sebagai 'di luar' dan 'di dalam'.Jika Anda ingin mengalihkan keluaran dari perintah Anda, maka shell perintah harus dalam keadaan luar saat mencapai pengalihan, jadi harus ada jumlah genap dari tanda kutip ganda yang tidak lolos (dengan tanda sisipan) sebelum pengalihan.
foo "a\"b " > out.txt
tidak akan berfungsi - shell perintah meneruskan keseluruhan"a\"b " > out.txt
ke foo sebagai argumen baris perintah gabungannya, alih-alih hanya"a\"b "
meneruskan dan mengarahkan keluaran ke out.txt .foo "a\^"b " > out.txt
juga tidak akan berfungsi, karena tanda sisipan^
ditemukan di dalam keadaan di mana itu adalah karakter biasa dan bukan karakter melarikan diri, jadi"a\^"b " > out.txt
diteruskan ke foo .Satu-satunya cara yang (mudah-mudahan) selalu berhasil adalah dengan menjaga shell perintah selalu dalam keadaan luar, karena dengan demikian pengalihan berfungsi.
Jika Anda tidak memerlukan pengalihan (atau karakter lain dengan arti khusus ke shell perintah), Anda dapat melakukannya tanpa tanda sisipan. Jika foo diartikan
\"
sebagai kutipan ganda literal, maka Anda dapat menyebutnya sebagaiKemudian foo menerima
"a\"b c"
sebagai teks argumen gabungannya dan dapat menafsirkannya sebagai satu argumen yang sama dengana"b c
.Sekarang - akhirnya - ke pertanyaan awal.
myscript '"test"'
dipanggil dari shell perintah Windows lolos'"test"'
ke myscript . Rupanya myscript menafsirkan tanda kutip tunggal dan ganda sebagai pemisah argumen dan menghapusnya. Anda perlu mencari tahu apa yang diterima myscript sebagai kutipan ganda literal dan kemudian tentukan itu dalam perintah Anda, gunakan^
untuk keluar dari karakter apa pun yang memiliki arti khusus ke shell perintah Windows. Mengingat itumyscript
juga tersedia di Unix, mungkin berhasil\"
. Mencobaatau, jika Anda tidak membutuhkan pengalihan,
sumber
Saya menelepon PowerShell dari cmd, dan memberikan tanda kutip dan tidak ada pelarian di sini yang berhasil. Aksen kubur bekerja untuk menghindari tanda kutip ganda pada pro permukaan Win 10 ini.
Di bawah ini adalah keluaran yang saya dapatkan untuk karakter lain agar lolos dari kutipan ganda:
Menggunakan kutipan lain untuk menyela kutipan tidak menghasilkan kutipan. Seperti yang Anda lihat, karakter itu sendiri diketik, tetapi tidak luput dari tanda kutip ganda.
sumber