Tanda kurung sudut keluar di prompt perintah Windows

94

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?

Jason
sumber
6
Kutipan juga akan digaungkan.
dalle

Jawaban:

171

Karakter escape Windows adalah ^, untuk beberapa alasan.

echo some string ^< with angle ^> brackets >>myfile.txt
Tim Robinson
sumber
10
Nah, garis miring terbalik digunakan untuk nama path dan tanda kutip ganda untuk membungkus nama file yang memiliki spasi, sehingga pilihan karakter yang tersisa tidak banyak.
James Curran
Ini juga berfungsi untuk karakter lain seperti ampersand (&), terima kasih.
tenfour
2
Bekerja dengan baik! echo some string ^< with angle ^> brackets >>conmenghasilkan: beberapa string <dengan sudut> tanda kurung
Ross Bradbury
1
Semua karena pc-dos asli menggunakan garis miring terbalik untuk jalur dan kompatibilitas mundur.
Jahmic
Saya menduga itu tidak terlalu acak. Dugaan saya adalah bahwa mereka ingin menggunakan karakter yang tidak mungkin muncul dalam teks normal, sehingga tidak menyebabkan karakter lolos dengan mudah, tetapi tidak diinginkan.
David A. Gray
24

Benar, karakter pelarian resmi adalah ^, tetapi hati-hati karena terkadang Anda membutuhkan tiga ^ karakter. Ini terkadang :

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

Salah satu trik dari omong kosong ini adalah dengan menggunakan perintah selain echomelakukan output dan kutipan dengan tanda kutip ganda:

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

Perhatikan bahwa ini tidak akan mempertahankan spasi utama pada teks perintah.

sin3.14
sumber
1
Lihat bagian ke-2 dari jawaban saya untuk penjelasan tentang mengapa pipa membutuhkan banyak jalan keluar.
dbenham
1
Ketiganya ^^^juga diperlukan untuk keluar dari perintah di konsol Azure DOS / Kudu.
lionello
Saya menemukan ini memang diperlukan ketika Anda ingin menyimpan nilai yang mengandung tanda kurung siku di keyvault Azure melalui Azure CLI.
Jaap
8

Ada metode yang menghindari ^urutan pelarian.

Anda dapat menggunakan variabel dengan ekspansi tertunda. Di bawah ini adalah demonstrasi skrip batch kecil

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

Atau Anda bisa menggunakan loop FOR / F. Dari baris perintah:

for /f "delims=" %A in ("<html>") do @echo %~A

Atau dari skrip batch:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

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:

echo ^^^<html^^^>|findstr .

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:

cmd /c "echo ^<html^>"|findstr .

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.

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

Perhatikan bahwa ekspansi tertunda NONAKTIF di skrip batch induk.

Tapi semua akan berantakan jika ekspansi tertunda diaktifkan di skrip induk. Berikut ini tidak berhasil:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

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:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

Jika dikutip, maka satu escape digunakan:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

Tetapi ada trik mengejutkan yang menghindari semua pelolosan - menutup sisi kiri pipa mencegah skrip induk berkembang !test!sebelum waktunya:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

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 ;-)

dbenham
sumber
3

Untuk menggunakan karakter khusus, seperti '>' pada Windows dengan echo, Anda perlu menempatkan karakter escape khusus sebelumnya.

Misalnya

echo A->B

tidak akan berfungsi karena '>' harus di-escape oleh '^':

 echo A-^>B

Lihat juga escape sequence . masukkan deskripsi gambar di sini

Ada file batch pendek, yang mencetak kumpulan dasar karakter khusus dan urutan pelolosannya.

orbitcowboy.dll
sumber
0

Meloloskan diri dari tanda kurung ala unix juga tidak berfungsi:

echo beberapa string \ <dengan sudut \> tanda kurung >> myfile.txt

Garis miring terbalik akan dianggap sebagai awal dari nama jalur absolut.

James Curran
sumber
2
Nama jalur absolut relatif terhadap huruf drive saat ini ...;)
dalle
Garis miring terbalik tidak dianggap sebagai awal nama jalur absolut di dalam teks untuk perintah echo - hanya teks biasa yang disalurkan ke mana pun Anda mengirimkannya. - 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.
BrainSlugs83
1
jawaban ini tidak menawarkan solusi untuk, yang memang tidak jelas, pertanyaan
G-.
-2

Anda juga dapat menggunakan tanda kutip ganda untuk keluar dari karakter khusus ...

echo some string "<" with angle ">" brackets >>myfile.txt
aalaap
sumber
4
Itu tidak berhasil. echo some string "<" with angle ">" brackets >>conmenghasilkan: beberapa string "<" with angle ">" brackets tetapi OP menginginkan beberapa string <with angle> brackets
Ross Bradbury