Mengapa perintah 'findstr' ini tidak berfungsi seperti yang diharapkan?


2

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?


OS apa yang kamu gunakan?
EBGreen

Windows 7. Perintah Prompt Biasa (mis. Tidak ada PowerShell).
CubicleSoft

Saya akan memeriksanya, tetapi mengapa tidak menggunakan PS?
EBGreen

Alat-alat Command Prompt dasar umumnya cukup untuk kebutuhan saya.
CubicleSoft

Jawaban:


6

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 > adalah cmd.exe metacharacter, yang Anda butuhkan adalah cmd.exe karakter melarikan diri, yang kebetulan ^. Sebagai contoh, perintah ini berfungsi untuk saya:

findstr /sic:"\"^>" *

Ini berfungsi dengan baik.
Karan

+1 untuk tautan ke pos blog MSDN yang luas. Menandai sebagai jawaban karena ini berfungsi.
CubicleSoft

4

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 keduanya echo ">" dan echo ^> 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 "">" dan echo "^">" 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:""^>" *.


findstr /sic:""^>" * tidak tidak bekerja di Win7! Apakah Anda mencobanya sendiri?
Karan

Bagaimana perintah itu berlaku pada sistem Anda? Saya memang mencobanya sendiri, pada mesin Windows 7 dan dapat memastikan itu tidak berfungsi.
Marcks Thomas

1
Win7 x64, membuat banyak file teks, beberapa punya "& gt; di dalamnya sementara sisanya tidak. Jalankan perintah Anda dan baru saja mendapat kursor yang berkedip di baris berikutnya, seolah sedang menunggu input. Saya bisa mengetik apa pun yang saya inginkan, tekan Enter beberapa kali, tetapi satu-satunya cara kembali ke prompt cmd adalah melalui Ctrl + C / Break. Tidak ada keluaran sama sekali.
Karan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.