Saya sering menggunakan program baris perintah 'findstr' ketika saya menulis perangkat lunak. Ini membantu saya menemukan semua file yang berisi string tertentu dengan cepat dalam satu set subdirektori. Jauh lebih cepat untuk menggunakan 'findstr' daripada yang lainnya dalam banyak kasus. Hari ini saya mengalami masalah di mana saya ingin menemukan string "& gt; , jadi saya menjalankan perintah ini (apa yang saya anggap sebagai string lolos yang cukup khas):
findstr /sic:"\">" *
Dan menerima kembali pesan kesalahan samar ini: "Nama file, nama direktori, atau sintaks label volume salah."
Mengubahnya menjadi:
findstr /sic:'\">' *
Bekerja dengan baik. Mengapa saya perlu menggunakan tanda kutip tunggal dan bukan tanda kutip ganda? Saya telah menjalankan ratusan (mungkin ribuan?) Perintah findstr sebelum tempat saya lolos dari tanda kutip ganda di dalam pembungkus kutipan ganda tanpa masalah. Apa yang membuat string pencarian khusus ini sangat berbeda?
sumber
Jawaban:
Ada dua tingkat pemrosesan yang terjadi di sini - pertama
cmd.exe
menguraikan baris perintah untuk menentukan apakah pengalihan, dll perlu terjadi, dan kemudian setelah itu,findstr
mendapat baris perintah yang tersisa dan melakukan parsing sendiri sesuai dengan aturannya sendiri (dalam praktiknya, biasanya sama untuk berbagai program).Ini Posting blog MSDN masuk ke beberapa detail tentang masalah ini.
Sepertinya saya sejak itu
>
adalahcmd.exe
metacharacter, yang Anda butuhkan adalahcmd.exe
karakter melarikan diri, yang kebetulan^
. Sebagai contoh, perintah ini berfungsi untuk saya:sumber
Karakter
>
digunakan untuk redirection dan umumnya perlu melarikan diri dengan tanda sisipan jika bagian dari string literal. Meng-enkapsulasi string dalam tanda kutip akan mencegah karakter metars diuraikan dan menghilangkan kebutuhan untuk melarikan diri. Itu sebabnya keduanyaecho ">"
danecho ^>
akan mencetak tanda lebih besar yang sebenarnya daripada mencoba mengarahkan ulang output.Kemunculan tanda kutip ganda yang kedua selalu menandai akhir dari string literal. Itu tidak dapat diloloskan, karena tanda sisipan tidak akan diuraikan sebagai metacharacter; itu di antara kutipan. Alhasil, keduanya
echo "">"
danecho "^">"
akan mencoba mengalihkan output, dalam hal ini ke file yang tidak valid.Di baris pertama Anda,
findstr /sic:"\">" *
, tanda kutip ganda kedua ditafsirkan sebagai akhir dari string literal. Karakter selanjutnya menunjukkan output yang diarahkan. Nama file berikutnya memang tidak valid; kesalahan yang dilemparkan hampir tidak samar. Sisa dari argumen yang dimaksud bahkan tidak terlihat oleh perintah findstr, yang hanya bisa dieksekusi/sic:"\"
. Jika Anda ingin tetap menggunakan tanda kutip ganda, sintaks berikut akan berlaku seperti yang dimaksudkan:findstr /sic:""^>" *
.sumber
findstr /sic:""^>" *
tidak tidak bekerja di Win7! Apakah Anda mencobanya sendiri?