Saya perlu menggemakan string yang berisi tanda kurung siku (<dan>) ke file di mesin Windows. Pada dasarnya yang ingin saya lakukan adalah sebagai berikut:
echo some string < with angle > brackets >>myfile.txt
Ini tidak berfungsi karena penerjemah perintah bingung dengan tanda kurung sudut. Saya bisa mengutip seluruh string seperti ini:
echo "some string < with angle > brackets" >>myfile.txt
Tapi kemudian saya memiliki tanda kutip ganda di file saya yang tidak saya inginkan.
Meloloskan diri dari tanda kurung ala unix juga tidak berfungsi:
echo some string \< with angle \> brackets >>myfile.txt
Ide ide?
Jawaban:
Karakter escape Windows adalah ^, untuk beberapa alasan.
sumber
echo some string ^< with angle ^> brackets >>con
menghasilkan: beberapa string <dengan sudut> tanda kurungBenar, karakter pelarian resmi adalah
^
, tetapi hati-hati karena terkadang Anda membutuhkan tiga^
karakter. Ini terkadang :Salah satu trik dari omong kosong ini adalah dengan menggunakan perintah selain
echo
melakukan output dan kutipan dengan tanda kutip ganda:Perhatikan bahwa ini tidak akan mempertahankan spasi utama pada teks perintah.
sumber
^^^
juga diperlukan untuk keluar dari perintah di konsol Azure DOS / Kudu.Ada metode yang menghindari
^
urutan pelarian.Anda dapat menggunakan variabel dengan ekspansi tertunda. Di bawah ini adalah demonstrasi skrip batch kecil
Atau Anda bisa menggunakan loop FOR / F. Dari baris perintah:
Atau dari skrip batch:
Metode ini Alasan bekerja adalah karena kedua ekspansi tertunda dan UNTUK ekspansi variabel terjadi setelah operator khusus suka
<
,>
,&
,|
,&&
,||
diurai. Lihat Bagaimana Windows Command Interpreter (CMD.EXE) mengurai skrip? untuk info lebih lanjut.sin3.14 menunjukkan bahwa pipa mungkin memerlukan beberapa jalan keluar . Sebagai contoh:
Alasan pipa memerlukan beberapa pelolosan adalah karena setiap sisi pipa dijalankan dalam proses CMD baru, sehingga garis diurai beberapa kali. Lihat Mengapa ekspansi tertunda gagal saat berada di dalam blok kode yang disalurkan? untuk penjelasan tentang banyak konsekuensi canggung dari implementasi pipa Window.
Ada metode lain untuk menghindari beberapa lolos saat menggunakan pipa. Anda dapat secara eksplisit membuat instance proses CMD Anda sendiri, dan melindungi pelolosan tunggal dengan tanda kutip:
Jika Anda ingin menggunakan teknik ekspansi tertunda untuk menghindari pelarian, maka ada lebih banyak kejutan (Anda mungkin tidak terkejut jika Anda ahli dalam desain CMD.EXE, tetapi tidak ada dokumentasi resmi MicroSoft yang menjelaskan hal ini)
Ingat bahwa setiap sisi pipa akan dieksekusi dalam proses CMD.EXE-nya sendiri, tetapi proses tersebut tidak mewarisi status perluasan tertunda - defaultnya adalah MATI. Jadi, Anda harus secara eksplisit membuat instance proses CMD.EXE Anda sendiri dan menggunakan opsi / V: ON untuk mengaktifkan perluasan yang tertunda.
Perhatikan bahwa ekspansi tertunda NONAKTIF di skrip batch induk.
Tapi semua akan berantakan jika ekspansi tertunda diaktifkan di skrip induk. Berikut ini tidak berhasil:
Masalahnya adalah itu
!test!
diperluas dalam skrip induk, sehingga proses CMD baru mencoba mengurai file yang tidak dilindungi<
dan>
.Anda bisa lolos dari
!
, tapi itu bisa rumit, karena tergantung pada apakah!
dikutip atau tidak.Jika tidak dikutip, maka diperlukan pelolosan ganda:
Jika dikutip, maka satu escape digunakan:
Tetapi ada trik mengejutkan yang menghindari semua pelolosan - menutup sisi kiri pipa mencegah skrip induk berkembang
!test!
sebelum waktunya:Tapi saya rasa itu bukan makan siang gratis, karena pengurai batch memasukkan spasi tambahan (mungkin tidak diinginkan) di akhir saat tanda kurung digunakan.
Tidak menyenangkan batch scripting ;-)
sumber
Untuk menggunakan karakter khusus, seperti '>' pada Windows dengan echo, Anda perlu menempatkan karakter escape khusus sebelumnya.
Misalnya
tidak akan berfungsi karena '>' harus di-escape oleh '^':
Lihat juga escape sequence .
Ada file batch pendek, yang mencetak kumpulan dasar karakter khusus dan urutan pelolosannya.
sumber
Garis miring terbalik akan dianggap sebagai awal dari nama jalur absolut.
sumber
echo \
misalnya berfungsi seperti yang diharapkan. - Tapi ya, "\" akan menjadi pilihan yang buruk untuk karakter melarikan diri baris perintah karena setiap perintah / program yang membutuhkan jalur atau nama file Anda harus mengetik `\` sebagai gantinya.Anda juga dapat menggunakan tanda kutip ganda untuk keluar dari karakter khusus ...
sumber
echo some string "<" with angle ">" brackets >>con
menghasilkan: beberapa string "<" with angle ">" brackets tetapi OP menginginkan beberapa string <with angle> brackets