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:
foo ^"a\^"b c^" ^> d > out.txt
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 argumen a"b c
, satu argumen >
, dan satu argumen d
.
Jika sebaliknya foo menafsirkan tanda petik ganda ""
sebagai tanda petik ganda literal, maka mulailah program Anda sebagai
foo ^"a^"^"b c^" ^> d > out.txt
Wawasan 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 sebagai
foo "a\"b c"
Kemudian foo menerima "a\"b c"
sebagai teks argumen gabungannya dan dapat menafsirkannya sebagai satu argumen yang sama dengan a"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 itu myscript
juga tersedia di Unix, mungkin berhasil \"
. Mencoba
myscript \^"test\^"
atau, jika Anda tidak membutuhkan pengalihan,
myscript \"test\"
myscript \"test\"