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