विंडोज फ़िनडक्ट कमांड के अनकम्प्रेस्ड फीचर्स और सीमाएँ क्या हैं?


188

Windows FINDSTR कमांड बहुत ही डॉक्यूमेंटेड है। वहाँ बहुत ही बुनियादी कमांड लाइन के माध्यम से उपलब्ध सहायता है FINDSTR /?, या HELP FINDSTR, लेकिन यह बहुत ही अपर्याप्त है। Https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr पर ऑनलाइन एक बहुत अधिक प्रलेखन है ।

कई FINDSTR फीचर्स और सीमाएँ हैं, जो दस्तावेज़ीकरण में भी संकेत नहीं हैं। न ही उन्हें पूर्व ज्ञान और / या सावधान प्रयोग के बिना प्रत्याशित किया जा सकता है।

तो सवाल यह है कि अनिर्दिष्ट FINDSTR फीचर्स और सीमाएँ क्या हैं?

इस सवाल का उद्देश्य कई अनिर्दिष्ट सुविधाओं के एक बंद भंडार प्रदान करना है ताकि:

ए) डेवलपर्स वहां मौजूद सुविधाओं का पूरा लाभ उठा सकते हैं।

बी) डेवलपर्स यह सोचकर अपना समय बर्बाद नहीं करते हैं कि जब ऐसा लगता है तो कुछ काम क्यों नहीं करता है।

कृपया सुनिश्चित करें कि आप जवाब देने से पहले मौजूदा दस्तावेज को जानते हैं। यदि सूचना को HELP द्वारा कवर किया जाता है, तो यह यहाँ नहीं है।

न ही यह FINDSTR के दिलचस्प उपयोग दिखाने के लिए एक जगह है। यदि कोई तार्किक व्यक्ति दस्तावेज़ीकरण के आधार पर FINDSTR के किसी विशेष उपयोग के व्यवहार का अनुमान लगा सकता है, तो यह यहाँ नहीं है।

उसी पंक्तियों के साथ, यदि कोई तार्किक व्यक्ति किसी भी मौजूदा उत्तर में निहित जानकारी के आधार पर किसी विशेष उपयोग के व्यवहार का अनुमान लगा सकता है, तो फिर से, यह यहां नहीं है।


15
या, वैकल्पिक रूप से, आप भद्दा अप्रलेखित एमएस उपयोगिता पूरी तरह खाई और स्थापित / उपयोग कर सकता है grepजो है बहुत अच्छी तरह से समझ और दस्तावेज :-) देखें stackoverflow.com/questions/2635740/... उदाहरण के लिए।
paxdiablo

17
हर तरह से, यदि आप FINDSTR के अलावा किसी अन्य चीज का उपयोग करने की स्थिति में हैं, तो इसकी अत्यधिक सलाह दी जाती है। लेकिन कुछ लोग ऐसे वातावरण में होते हैं जहां 3 पार्टी की सुविधाएं वर्जित हैं।
डेबनहम

4
कोई अपराध नहीं हुआ। मैंने गंभीरता से अपने स्वयं के FINDSTR डिस्क्लेमर में डालने पर विचार किया जो आपकी टिप्पणी के समान था! :)
dbenham

41
मैं स्तब्ध हूं और किसी ने इस प्रश्न को "नॉट कंस्ट्रक्टिव" पाया और बंद करने के लिए वोट दिया। बहुत सारे विचार विशेष रूप से "राय, बहस, तर्क, मतदान, या विस्तारित चर्चा" से बचने के लिए सवाल में चले गए। इस सवाल को 3.5 महीने के लिए पोस्ट किया गया है, और उद्धृत नकारात्मक कोई भी नहीं हुआ है। युग्मित उत्तर तथ्यों से भरा हुआ है, और कई घंटों के श्रमसाध्य शोध और प्रयोग की आवश्यकता है।
dbenham

6
कुछ पाठकों को खोज कमांड के ऐतिहासिक संदर्भ में रुचि हो सकती है: blogs.msdn.com/b/oldnewthing/archive/2012/11/28/10372436.aspx
हैरी जॉनसन

जवाबों:


279

प्रस्तावना
इस जवाब में दी गई जानकारी के बहुत इकट्ठा किया एक Vista मशीन पर चलने प्रयोगों के आधार पर किया गया है। जब तक स्पष्ट रूप से अन्यथा नहीं कहा जाता है, मैंने पुष्टि नहीं की है कि क्या जानकारी अन्य विंडोज संस्करणों पर लागू होती है।

FINDSTR आउटपुट
प्रलेखन FINDSTR के आउटपुट को समझाने के लिए कभी भी परेशान नहीं करता है। यह इस तथ्य की ओर संकेत करता है कि मिलान रेखाएँ मुद्रित होती हैं, लेकिन इससे अधिक कुछ नहीं।

मिलान लाइन आउटपुट का प्रारूप इस प्रकार है:

फ़ाइल नाम: LineNumber: lineOffset: पाठ

कहाँ पे

fileName: = फाइल का नाम जिसमें मैचिंग लाइन है। फ़ाइल का नाम मुद्रित नहीं किया जाता है यदि अनुरोध एकल फ़ाइल के लिए स्पष्ट रूप से किया गया था, या यदि पाइप किए गए इनपुट या पुनर्निर्देशित इनपुट की खोज कर रहा है। जब प्रिंट किया जाता है, तो फ़ाइलनाम में हमेशा प्रदान की गई कोई भी जानकारी शामिल होगी। यदि/Sविकल्प का उपयोग किया जाता हैतो अतिरिक्त पथ जानकारी जोड़ी जाएगी। मुद्रित पथ हमेशा उपलब्ध पथ के सापेक्ष होता है, या वर्तमान निर्देशिका के सापेक्ष यदि कोई नहीं प्रदान करता है।

नोट - फ़ाइल नाम उपसर्ग जब का उपयोग करके एकाधिक फ़ाइलों को खोज कर बचा जा सकता है गैर मानक (और खराब प्रलेखित) वाइल्डकार्ड < और >। ये वाइल्डकार्ड कैसे काम करते हैं, इसके सटीक नियम यहां देखे जा सकते हैं । अंत में, आप इस उदाहरण को देख सकते हैं कि FINDSTR के साथ गैर-मानक वाइल्डकार्ड कैसे काम करते हैं

लाइननंबर: = 1 लाइन के इनपुट के साथ 1 के साथ एक दशमलव मान के रूप में प्रतिनिधित्व लाइन की लाइन संख्या। यदि/Nविकल्प निर्दिष्टकिया गया है तो केवल मुद्रित।

लाइनऑफसेट: = 1 लाइन के 1 वर्ण का प्रतिनिधित्व करने के साथ मिलान रेखा की शुरुआत का दशमलव बाइट ऑफसेट। यदि/Oविकल्प निर्दिष्टकिया गया है तो केवल मुद्रित। यहलाइन के भीतर मैच की भरपाई नहीं है। यह फ़ाइल की शुरुआत से पंक्ति की शुरुआत तक बाइट्स की संख्या है।

पाठ = किसी भी <CR> और / या <LF> सहित मिलान रेखा का द्विआधारी प्रतिनिधित्व। बाइनरी आउटपुट से कुछ भी नहीं बचा है, जैसे कि यह उदाहरण जो सभी लाइनों से मेल खाता है, मूल फ़ाइल की एक सटीक बाइनरी कॉपी का उत्पादन करेगा।

FINDSTR "^" FILE >FILE_COPY

/ A विकल्प फ़ाइल का नाम सेट करता है: नाम: लाइननंबर :, और लाइनऑफ़सेट: केवल आउटपुट। मिलान लाइन का पाठ हमेशा वर्तमान कंसोल रंग के साथ आउटपुट होता है। / A विकल्प का केवल तभी प्रभाव होता है जब आउटपुट सीधे कंसोल पर प्रदर्शित होता है। यदि आउटपुट को फ़ाइल या पाइप पर रीडायरेक्ट किया जाता है तो / A विकल्प का कोई प्रभाव नहीं पड़ता है। देखें Aacini के जवाब में 2018/08/18 संपादित करें जब उत्पादन CON पर भेज दिया जाएगा गाड़ी व्यवहार के वर्णन के लिए।

अधिकांश नियंत्रण वर्ण और कई विस्तारित ASCII वर्ण XP पर डॉट्स के रूप में प्रदर्शित
होते हैं, XP पर FINDSTR स्क्रीन पर डॉट्स (अवधि) के रूप में मिलान लाइनों से अधिकांश गैर-मुद्रण योग्य नियंत्रण वर्ण प्रदर्शित करता है। निम्नलिखित नियंत्रण वर्ण अपवाद हैं; वे स्वयं के रूप में प्रदर्शित होते हैं: 0x09 टैब, 0x0A लाइनफीड, 0x0B वर्टिकल टैब, 0x0C फॉर्म फ़ीड, 0x0D कैरिज रिटर्न।

XP FINDSTR भी कई विस्तृत ASCII वर्णों को डॉट्स में कनवर्ट करता है। विस्तारित ASCII वर्ण जो XP पर डॉट्स के रूप में प्रदर्शित होते हैं, वे वही होते हैं जो कमांड लाइन पर आपूर्ति किए जाने पर बदल जाते हैं। देखें - "विस्तारित ASCII परिवर्तन आदेश पंक्ति पैरामीटर की वर्ण सीमा पर" अनुभाग में, बाद में इस पोस्ट में

नियंत्रण वर्ण और विस्तारित ASCII एक्सपी पर डॉट्स में परिवर्तित नहीं होते हैं यदि आउटपुट पाइप किया जाता है, तो फ़ाइल के लिए पुनर्निर्देशित किया जाता है, या फॉर इन () क्लॉज़ के भीतर।

विस्टा और विंडोज 7 हमेशा सभी पात्रों को खुद के रूप में प्रदर्शित करते हैं, कभी डॉट्स के रूप में नहीं।

रिटर्न कोड (ERRORLEVEL)

  • 0 (सफलता)
    • मैच कम से कम एक फ़ाइल की एक पंक्ति में पाया गया था।
  • 1 (विफलता)
    • किसी भी फाइल की किसी भी लाइन में कोई मेल नहीं मिला।
    • /A:xxविकल्प द्वारा निर्दिष्ट अमान्य रंग
  • 2 (त्रुटि)
    • असंगत विकल्प /Lऔर /Rदोनों निर्दिष्ट
    • गुम तर्क के बाद /A:, /F:, /C:, /D:, या/G:
    • द्वारा निर्दिष्ट /F:fileया /G:fileनहीं मिली फ़ाइल
  • 255 (त्रुटि)

खोज करने के लिए डेटा का स्रोत (विंडोज 7 के साथ परीक्षणों पर आधारित अद्यतन)
Findstr निम्नलिखित स्रोतों में से केवल एक से डेटा खोज सकता है:

  • फ़ाइल नाम तर्क और / या /F:fileविकल्प का उपयोग करके निर्दिष्ट किया गया है।

  • स्टड पुनर्निर्देशन के माध्यम से findstr "searchString" <file

  • एक पाइप से डेटा स्ट्रीम type file | findstr "searchString"

तर्क / विकल्प पुनर्निर्देशन पर पूर्वता लेते हैं, जो कि पाइप किए गए डेटा पर पूर्वता लेता है।

फ़ाइल नाम तर्क और /F:fileसंयुक्त हो सकता है। एकाधिक फ़ाइल नाम तर्क का उपयोग किया जा सकता है। यदि कई /F:fileविकल्प निर्दिष्ट किए जाते हैं, तो केवल पिछले एक का उपयोग किया जाता है। फ़ाइल नाम तर्कों में वाइल्ड कार्ड की अनुमति दी जाती है, लेकिन इसके द्वारा बताई गई फ़ाइल के भीतर नहीं /F:file

तलाश किए जाने के स्रोत (विंडोज 7 के साथ परीक्षण के आधार पर अपडेट किया गया) और विकल्प जोड़ा जा सकता है। कई विकल्प निर्दिष्ट किए जा सकते हैं। यदि कई विकल्प निर्दिष्ट किए जाते हैं, तो केवल पिछले एक का उपयोग किया जाता है। यदि दोनों में से या प्रयोग किया जाता है, तो सभी गैर विकल्प तर्क खोज करने के लिए फ़ाइलों को माना जाता है। तो न तो है और न ही प्रयोग किया जाता है, तो पहली गैर विकल्प तर्क खोज पदों की एक अंतरिक्ष सीमांकित सूची के रूप में व्यवहार किया जाता है।
/G:file/C:string/C:string/G:file/G:file/C:string/G:file/C:string

/F:FILEविकल्प का उपयोग करते समय फ़ाइल के नाम फ़ाइल के भीतर उद्धृत नहीं किए जाने चाहिए ।
फ़ाइल नामों में स्थान और अन्य विशेष वर्ण हो सकते हैं। अधिकांश आदेशों के लिए आवश्यक है कि ऐसे फ़ाइल नाम उद्धृत किए जाएं। लेकिन FINDSTR /F:files.txtऑप्शन के लिए जरूरी है कि files.txt के भीतर फाइलनाम को उद्धृत नहीं किया जाना चाहिए। यदि नाम उद्धृत किया गया है तो फ़ाइल नहीं मिलेगी।

बग - लघु 8.3 फ़ाइल नाम /Dऔर /Sविकल्प तोड़ सकते हैं
सभी विंडोज़ कमांड के साथ, FINDSTR खोज करने के लिए फ़ाइलों की तलाश करते समय लंबे नाम और संक्षिप्त 8.3 नाम दोनों का मिलान करने का प्रयास करेगा। मान लें कि वर्तमान फ़ोल्डर में निम्न गैर-रिक्त फ़ाइलें हैं:

b1.txt
b.txt2
c.txt

निम्न आदेश सभी 3 फ़ाइलों को सफलतापूर्वक मिल जाएगा:

findstr /m "^" *.txt

b.txt2मेल खाता है क्योंकि इसी संक्षिप्त नाम से B9F64~1.TXTमेल खाता है। यह अन्य सभी विंडोज कमांड के व्यवहार के अनुरूप है।

लेकिन साथ एक बग /Dऔर /Sविकल्प केवल खोजने के लिए निम्न कमांड का कारण बनता हैb1.txt

findstr /m /d:. "^" *.txt
findstr /m /s "^" *.txt

बग ढूंढे जाने b.txt2से रोकता है, साथ ही सभी फ़ाइल नाम जो b.txt2एक ही डायरेक्टरी के बाद सॉर्ट करते हैं। अतिरिक्त फ़ाइलें जो पहले सॉर्ट करती हैं, जैसे a.txt, पाई जाती हैं। अतिरिक्त फ़ाइलें जो बाद में सॉर्ट करती हैं, जैसे d.txtबग को ट्रिगर किए जाने के बाद याद आती हैं।

खोज की गई प्रत्येक निर्देशिका को स्वतंत्र रूप से व्यवहार किया जाता है। उदाहरण के लिए, /Sविकल्प माता-पिता की फ़ाइलों को खोजने में विफल होने के बाद बच्चे के फ़ोल्डर में सफलतापूर्वक खोजना शुरू कर देगा, लेकिन एक बार बग के कारण बच्चे में एक छोटी फ़ाइल का नाम छूट जाता है, तो उस बच्चे के फ़ोल्डर में बाद की सभी फाइलें भी छूट जाएगी। ।

यदि NTFS 8.3 नाम पीढ़ी अक्षम मशीन पर समान फ़ाइल नाम बनाए जाते हैं, तो कमांड बग मुक्त काम करती है। बेशक b.txt2नहीं मिलेगा, लेकिन c.txtठीक से मिल जाएगा।

सभी छोटे नाम बग को ट्रिगर नहीं करते हैं। बिगड़े हुए व्यवहार के सभी उदाहरणों में मैंने एक विस्तार को शामिल किया है जो कि छोटे अक्षरों में 3 छोटे से 8.3 नाम से अधिक लंबा है जो सामान्य नाम के समान शुरू होता है जिसमें 8.3 नाम की आवश्यकता नहीं होती है।

XP, विस्टा और विंडोज 7 पर बग की पुष्टि की गई है।

गैर मुद्रण योग्य पात्रों और /Pविकल्प विकल्प findstr कि निम्नलिखित दशमलव बाइट कोड के किसी भी ऐसी कोई भी फ़ाइल को छोड़ने के लिए कारण बनता है: 0-7, 14-25, 27-31।
/P

एक और तरीका रखो, /Pविकल्प केवल उन फ़ाइलों को छोड़ देगा जिनमें गैर-मुद्रण योग्य नियंत्रण वर्ण हैं। नियंत्रण वर्ण 31 (0x1F) से कम या बराबर कोड हैं। FINDSTR निम्नलिखित नियंत्रण वर्णों को मुद्रण योग्य मानता है:

 8  0x08  backspace
 9  0x09  horizontal tab
10  0x0A  line feed
11  0x0B  vertical tab
12  0x0C  form feed
13  0x0D  carriage return
26  0x1A  substitute (end of text)

अन्य सभी नियंत्रण वर्णों को गैर-मुद्रण योग्य माना जाता है, जिनमें से उपस्थिति /Pफ़ाइल को छोड़ने का विकल्प देती है।

पाइप्ड और रीडायरेक्ट किए गए इनपुट ने <CR><LF>जोड़ा हो सकता है
यदि इनपुट को पाइप में <LF>डाला गया है और स्ट्रीम का अंतिम वर्ण नहीं है , तो FINDSTR स्वचालित रूप <CR><LF>से इनपुट के लिए अपील करेगा । एक्सपी, विस्टा और विंडोज 7 पर इसकी पुष्टि की गई है (मैं समझता था कि इनपुट को संशोधित करने के लिए विंडोज पाइप जिम्मेदार था, लेकिन मुझे तब से पता चला है कि FINDSTR वास्तव में संशोधन कर रहा है।)

विस्टा पर पुनर्निर्देशित इनपुट के लिए भी यही सच है। यदि पुनर्निर्देशित इनपुट के रूप में उपयोग की गई फ़ाइल का अंतिम वर्ण नहीं है <LF>, तो FINDSTR स्वचालित रूप <CR><LF>से इनपुट में संलग्न हो जाएगा । हालाँकि, XP और Windows 7 पुनर्निर्देशित इनपुट को परिवर्तित नहीं करते हैं।

XP और Windows 7 पर FINDSTR हैंग होता है, यदि पुनर्निर्देशित इनपुट समाप्त नहीं होता है, तो<LF>
यह XP और Windows 7 पर एक बुरा "सुविधा" है। यदि पुनर्निर्देशित इनपुट के रूप में उपयोग की गई फ़ाइल का अंतिम वर्ण समाप्त नहीं होता है <LF>, तो FINDSTR एक बार इसे अनिश्चित काल तक लटका देगा। पुनर्निर्देशित फ़ाइल के अंत तक पहुँचता है।

पाइप्ड डेटा की अंतिम पंक्ति को अनदेखा किया जा सकता है यदि इसमें एक एकल वर्ण शामिल हो।
यदि इनपुट में पाइप है और अंतिम पंक्ति में एकल वर्ण है <LF>, जिसका अनुसरण नहीं किया जाता है , तो FINDSTR अंतिम पंक्ति को पूरी तरह से अनदेखा कर देता है।

उदाहरण - एक एकल वर्ण वाला पहला कमांड और कोई भी <LF>मेल करने में विफल रहता है, लेकिन 2 वर्णों वाला दूसरा कमांड ठीक काम करता है, जैसा कि तीसरा आदेश है जिसमें एक चरित्र नईलाइन समाप्त करने के साथ है।

> set /p "=x" <nul | findstr "^"

> set /p "=xx" <nul | findstr "^"
xx

> echo x| findstr "^"
x

DosTips उपयोगकर्ता स्पंज बेली द्वारा नए खोज पथ पर रिपोर्ट किया गया । XP, विंडोज 7 और विंडोज 8 पर पुष्टि की। विस्टा के बारे में अभी तक नहीं सुना। (मैं अब परीक्षण करने के लिए Vista नहीं है)।

विकल्प वाक्य रचना
विकल्प के साथ या तो पहले से जुड़ा हुआ जा सकता है /या - विकल्प एक एकल के बाद concatenated किया जा सकता है /या -। हालाँकि, संक्षिप्त विकल्प सूची में अधिकांश एक मल्टीचैकर विकल्प जैसे कि OFF या F :, हो सकता है और बहु-वर्ण विकल्प सूची में अंतिम विकल्प होना चाहिए।

किसी भी लाइन के लिए असंवेदनशील रेगेक्स सर्च को व्यक्त करने के सभी समान तरीके निम्नलिखित हैं, जिसमें किसी भी क्रम में "हैलो" और "अलविदा" दोनों शामिल हैं।

  • /i /r /c:"hello.*goodbye" /c:"goodbye.*hello"

  • -i -r -c:"hello.*goodbye" /c:"goodbye.*hello"

  • /irc:"hello.*goodbye" /c:"goodbye.*hello"

खोज स्ट्रिंग लंबाई सीमा
विस्टा पर एक खोज स्ट्रिंग के लिए अधिकतम अनुमत लंबाई 511 बाइट्स है। यदि कोई खोज स्ट्रिंग 511 से अधिक है तो परिणाम FINDSTR: Search string too long.ERRORLEVEL 2 के साथ एक त्रुटि है।

एक नियमित अभिव्यक्ति खोज करते समय, अधिकतम खोज स्ट्रिंग लंबाई 254 है। 255 और 511 के बीच की लंबाई के साथ एक नियमित अभिव्यक्ति FINDSTR: Out of memoryERRORLEVEL 2 के साथ त्रुटि होगी। एक नियमित अभिव्यक्ति लंबाई> 511 FINDSTR: Search string too long.त्रुटि में परिणाम ।

Windows XP पर खोज स्ट्रिंग की लंबाई जाहिरा तौर पर कम है। त्रुटि का पता लगाएं: "खोज स्ट्रिंग बहुत लंबी है": "लूप" के लिए "सबस्ट्रिंग" कैसे निकालें और मैच करें? XP की सीमा शाब्दिक और रीगेक्स दोनों खोजों के लिए 127 बाइट्स है।

लाइन की लंबाई सीमा
कमांड लाइन तर्क के रूप में या / F: FILE विकल्प के रूप में निर्दिष्ट फ़ाइलों की कोई ज्ञात लाइन लंबाई सीमा नहीं है। खोजों को सफलतापूर्वक एक 128 एमबी फ़ाइल के खिलाफ चलाया गया था जिसमें एक भी <LF> नहीं था।

पाइप्ड डेटा और रीडायरेक्टेड इनपुट 8191 बाइट्स प्रति पंक्ति तक सीमित है। यह सीमा FINDSTR की "सुविधा" है। यह पाइप या पुनर्निर्देशन के लिए अंतर्निहित नहीं है। रीडायरेक्ट किए गए स्टडिन या पाइप किए गए इनपुट का उपयोग करने वाला FINDSTR कभी भी किसी भी लाइन से मेल नहीं खाता जो> = 8k बाइट्स हो। लाइन्स> = 8k stderr के लिए एक त्रुटि संदेश उत्पन्न करता है, लेकिन खोज स्ट्रिंग कम से कम एक फ़ाइल के कम से कम एक लाइन में पाए जाने पर अभी भी 0 है।

डिफ़ॉल्ट प्रकार की खोज: शाब्दिक बनाम नियमित अभिव्यक्ति
/C:"string" - डिफ़ॉल्ट / एल शाब्दिक है। स्पष्ट रूप से / L विकल्प को / C: "string" के साथ संयोजित करना निश्चित रूप से काम करता है लेकिन बेमानी है।

"string argument"- डिफ़ॉल्ट बहुत पहले खोज स्ट्रिंग की सामग्री पर निर्भर करता है। (याद रखें कि सर्च स्पेस को डिलीट करने के लिए <space> का उपयोग किया जाता है।) यदि पहली सर्च स्ट्रिंग एक वैध रेग्युलर एक्सप्रेशन है जिसमें कम से कम एक अन-एस्केप्ड मेटा-कैरेक्टर होता है, तो सभी सर्च स्ट्रिंग्स को रेगुलर एक्सप्रेशन के रूप में माना जाता है। अन्यथा सभी खोज तारों को शाब्दिक माना जाता है। उदाहरण के लिए, "51.4 200"दो नियमित अभिव्यक्तियों के रूप में माना जाएगा क्योंकि पहले स्ट्रिंग में एक अन-एस्केप डॉट है, जबकि "200 51.4"दो शाब्दिक के रूप में माना जाएगा क्योंकि पहले स्ट्रिंग में कोई मेटा-वर्ण नहीं है।

/G:file- डिफ़ॉल्ट फ़ाइल में पहली गैर-खाली लाइन की सामग्री पर निर्भर करता है। यदि पहली खोज स्ट्रिंग एक वैध नियमित अभिव्यक्ति है जिसमें कम से कम एक अन-एस्केप्ड मेटा-चरित्र है, तो सभी खोज स्ट्रिंग को नियमित अभिव्यक्ति के रूप में माना जाता है। अन्यथा सभी खोज तारों को शाब्दिक माना जाता है।

सिफ़ारिश - हमेशा स्पष्ट रूप से निर्दिष्ट /Lशाब्दिक विकल्प या /Rका उपयोग करते समय नियमित अभिव्यक्ति विकल्प "string argument"या /G:file

बग - कई शाब्दिक खोज स्ट्रिंग निर्दिष्ट करना अविश्वसनीय परिणाम दे सकता है

निम्नलिखित सरल FINDSTR उदाहरण एक मैच खोजने में विफल रहता है, भले ही यह होना चाहिए।

echo ffffaaa|findstr /l "ffffaaa faffaffddd"

इस बग की पुष्टि विंडोज सर्वर 2003, विंडोज एक्सपी, विस्टा और विंडोज 7 पर की गई है।

प्रयोगों के आधार पर, FINDSTR विफल हो सकता है यदि निम्न में से सभी शर्तें पूरी हों:

  • खोज कई शाब्दिक खोज स्ट्रिंग का उपयोग कर रही है
  • खोज के तार अलग-अलग लंबाई के होते हैं
  • एक छोटी खोज स्ट्रिंग में लंबी खोज स्ट्रिंग के साथ ओवरलैप की कुछ मात्रा होती है
  • खोज मामला संवेदनशील है (कोई /Iविकल्प नहीं )

मैंने जो भी असफलताएँ देखीं, उनमें यह हमेशा कम खोज के तार हैं जो विफल होते हैं।

अधिक जानकारी के लिए यह देखें कि यह FINDSTR उदाहरण कई शाब्दिक खोज स्ट्रिंग के साथ मेल खाने के लिए क्यों नहीं है?

कमांड लाइन तर्कों के भीतर उद्धरण और बैकस्लैस
नोट - उपयोगकर्ता एमसी एनडी की टिप्पणियां इस खंड के लिए वास्तविक रूप से जटिल नियमों को दर्शाती हैं। इसमें 3 अलग-अलग पार्सिंग चरण शामिल हैं:

  • पहले cmd.exe को कुछ उद्धरणों के लिए ^ के रूप में भाग जाने की आवश्यकता हो सकती है "(वास्तव में FINDSTR से कोई लेना देना नहीं है)
  • अगला FINDSTR पूर्व 2008 MS C / C ++ तर्क पार्सर का उपयोग करता है , जिसमें "और \" के विशेष नियम हैं
  • तर्क पार्सर के खत्म होने के बाद, FINDSTR इसके अलावा एक अल्फा-न्यूमेरिक कैरेक्टर को शाब्दिक रूप से मानता है, लेकिन \ N ने अल्फ़ा-न्यूमेरिक कैरेक्टर को एक एस्केप कैरेक्टर के रूप में देखा।

इस हाइलाइट किए गए सेक्शन का शेष भाग 100% सही नहीं है। यह कई स्थितियों के लिए एक मार्गदर्शक के रूप में काम कर सकता है, लेकिन कुल समझ के लिए उपरोक्त नियमों की आवश्यकता है।

कमांड लाइन सर्च स्ट्रिंग्स के भीतर क्वैश्चन क्विटिंग कमांड लाइन सर्च स्ट्रिंग्स के
भीतर उद्धरण जैसे बैकस्लैश के साथ बच जाना चाहिए \"। यह शाब्दिक और रेगेक्स दोनों खोज स्ट्रिंग के लिए सही है। यह जानकारी XP, विस्टा और विंडोज 7 पर पुष्टि की गई है।

नोट: बोली को CMD.EXE पार्सर के लिए भी भाग जाने की आवश्यकता हो सकती है, लेकिन इसका FINDSTR से कोई लेना-देना नहीं है। उदाहरण के लिए, आपके द्वारा उपयोग किए जा सकने वाले एकल उद्धरण की खोज करने के लिए:

FINDSTR \^" file && echo found || echo not found

कमांड लाइन शाब्दिक खोज स्ट्रिंग के भीतर बैकस्लैश से बचना शाब्दिक खोज स्ट्रिंग में
बैकस्लैश को सामान्य रूप से \या के रूप में दर्शाया जा सकता है \\। वे आम तौर पर समकक्ष हैं। (विस्टा में असामान्य मामले हो सकते हैं जहां बैकस्लैश को हमेशा बच जाना चाहिए, लेकिन मेरे पास अब परीक्षण करने के लिए विस्टा मशीन नहीं है)

लेकिन कुछ विशेष मामले हैं:

जब लगातार बैकस्लैश की खोज की जाती है, तो सभी को अंतिम रूप से बच जाना चाहिए। अंतिम बैकलैश वैकल्पिक रूप से बच सकता है।

  • \\\\\या के रूप में कोडित किया जा सकता है\\\\
  • \\\\\\\\या के रूप में कोडित किया जा सकता है\\\\\\

एक उद्धरण से पहले एक या अधिक बैकस्लैश की खोज करना विचित्र है। तर्क का सुझाव होगा कि उद्धरण से बच जाना चाहिए, और प्रत्येक अग्रणी बैकस्लैश से बचना होगा, लेकिन यह काम नहीं करता है! इसके बजाय, प्रत्येक प्रमुख बैकस्लैश को डबल बच जाना चाहिए, और उद्धरण सामान्य रूप से बच जाता है:

  • \" के रूप में कोडित होना चाहिए \\\\\"
  • \\" के रूप में कोडित होना चाहिए \\\\\\\\\"

जैसा कि पहले उल्लेख किया गया है, एक या अधिक बच गए उद्धरणों ^को सीएमडी पार्सर के साथ भागने की भी आवश्यकता हो सकती है

इस खंड की जानकारी की पुष्टि XP और विंडोज 7 पर की गई है।

कमांड लाइन regex खोज स्ट्रिंग्स के भीतर बैकस्लैश से बचना

  • केवल विस्टा: एक रेक्स में बैकस्लैश या तो डबल बच जाना चाहिए \\\\, या फिर एक चरित्र वर्ग के भीतर एक जैसे बच गए [\\]

  • XP और विंडोज 7: एक रेक्स में बैकस्लैश को हमेशा के रूप में दर्शाया जा सकता है [\\]। इसे सामान्य रूप से दर्शाया जा सकता है \\। लेकिन यह कभी काम नहीं करता है यदि बैकस्लैश एक बची हुई बोली से पहले हो।

    एक बची हुई बोली से पहले एक या एक से अधिक बैकस्लैश या तो डबल बच जाना चाहिए, या अन्य के रूप में कोडित किया जाना चाहिए [\\]

    • \"के रूप में \\\\\"या कोडित किया जा सकता है[\\]\"
    • \\"के रूप में कोडित किया जा सकता है \\\\\\\\\"या [\\][\\]\"या\\[\\]\"

/ G के भीतर उद्धरण और बैकस्लैश से बचना: FILE शाब्दिक खोज स्ट्रिंग
स्टैंडअलोन उद्धरण और बैकस्लैश / G द्वारा निर्दिष्ट शाब्दिक खोज स्ट्रिंग फ़ाइल के भीतर: फ़ाइल की जरूरत नहीं है, लेकिन वे हो सकते हैं।

"और \"बराबर हैं।

\और \\बराबर हैं।

यदि इरादा \\ खोजना है, तो कम से कम अग्रणी बैकस्लैश से बच जाना चाहिए। दोनों \\\और \\\\काम।

आशय को खोजने के लिए \ "है, तो कम से कम प्रमुख बैकस्लैश भाग निकले किया जाना चाहिए। दोनों \\"और \\\"काम करते हैं।

/ G के भीतर उद्धरण और बैकस्लैश
से बचना : FILE रेगेक्स सर्च स्ट्रिंग्स यह एक ऐसा मामला है जहां प्रलेखन के आधार पर भागने के क्रम अपेक्षित रूप से काम करते हैं। उद्धरण एक रेगेक्स मेटाचैकर नहीं है, इसलिए इसे भागने (लेकिन हो सकता है) की आवश्यकता नहीं है। बैकस्लैश एक रेगीक्स मेटाचैकर है, इसलिए इसे बचना चाहिए।

कमांड लाइन मापदंडों के लिए वर्ण सीमाएँ - विस्तारित ASCII परिवर्तन
शून्य वर्ण (0x00) कमांड लाइन पर किसी भी स्ट्रिंग में दिखाई नहीं दे सकता है। किसी भी अन्य एकल बाइट चरित्र स्ट्रिंग (0x01 - 0xFF) में दिखाई दे सकते हैं। हालाँकि, FINDSTR ने कई विस्तारित ASCII वर्णों को धर्मान्तरित किया जो इसे कमांड लाइन मापदंडों के भीतर अन्य वर्णों में पाता है। इसका दो तरह से प्रभाव पड़ता है:

1) कई विस्तारित ASCII वर्ण कमांड लाइन पर खोज स्ट्रिंग के रूप में उपयोग किए जाने पर स्वयं से मेल नहीं खाएंगे। यह सीमा शाब्दिक और रीगेक्स खोजों के लिए समान है। यदि खोज स्ट्रिंग में विस्तृत ASCII होना चाहिए, तो /G:FILEइसके बजाय विकल्प का उपयोग किया जाना चाहिए।

2) FINDSTR फ़ाइल को खोजने में विफल हो सकता है यदि नाम में ASCII वर्ण हैं और कमांड लाइन पर फ़ाइल का नाम निर्दिष्ट है। यदि खोज की जाने वाली फ़ाइल में नाम में ASCII विस्तारित है, तो /F:FILEइसके बजाय विकल्प का उपयोग किया जाना चाहिए।

यहाँ विस्तृत ASCII वर्ण परिवर्तनों की पूरी सूची है, जो FINDSTR कमांड लाइन स्ट्रिंग्स पर करता है। प्रत्येक चरित्र को दशमलव बाइट कोड मान के रूप में दर्शाया गया है। पहला कोड कमांड लाइन पर दिए गए चरित्र का प्रतिनिधित्व करता है, और दूसरा कोड उस चरित्र का प्रतिनिधित्व करता है जिसे यह रूपांतरित किया जाता है। नोट - इस सूची को एक अमेरिकी मशीन पर संकलित किया गया था। मुझे नहीं पता कि अन्य भाषाओं का इस सूची पर क्या प्रभाव पड़ सकता है।

158 treated as 080     199 treated as 221     226 treated as 071
169 treated as 170     200 treated as 043     227 treated as 112
176 treated as 221     201 treated as 043     228 treated as 083
177 treated as 221     202 treated as 045     229 treated as 115
178 treated as 221     203 treated as 045     231 treated as 116
179 treated as 221     204 treated as 221     232 treated as 070
180 treated as 221     205 treated as 045     233 treated as 084
181 treated as 221     206 treated as 043     234 treated as 079
182 treated as 221     207 treated as 045     235 treated as 100
183 treated as 043     208 treated as 045     236 treated as 056
184 treated as 043     209 treated as 045     237 treated as 102
185 treated as 221     210 treated as 045     238 treated as 101
186 treated as 221     211 treated as 043     239 treated as 110
187 treated as 043     212 treated as 043     240 treated as 061
188 treated as 043     213 treated as 043     242 treated as 061
189 treated as 043     214 treated as 043     243 treated as 061
190 treated as 043     215 treated as 043     244 treated as 040
191 treated as 043     216 treated as 043     245 treated as 041
192 treated as 043     217 treated as 043     247 treated as 126
193 treated as 045     218 treated as 043     249 treated as 250
194 treated as 045     219 treated as 221     251 treated as 118
195 treated as 043     220 treated as 095     252 treated as 110
196 treated as 045     222 treated as 221     254 treated as 221
197 treated as 043     223 treated as 095
198 treated as 221     224 treated as 097

किसी भी वर्ण> 0 से ऊपर की सूची में नहीं है, खुद को भी शामिल माना जाता है, <CR>और < LF>। विषम वर्णों को शामिल करने का सबसे आसान तरीका है <CR>और <LF>उन्हें एक पर्यावरण चर में लाना और कमांड लाइन तर्क के भीतर विलंबित विस्तार का उपयोग करना है।

/ G: FILE और / F: फ़ाइल विकल्प में निर्दिष्ट स्ट्रिंग्स के लिए वर्ण सीमाएँ
फ़ाइल में nul (0x00) वर्ण दिखाई दे सकते हैं, लेकिन यह C स्ट्रिंग टर्मिनेटर की तरह कार्य करता है। शून्य वर्ण के बाद के किसी भी वर्ण को एक अलग तार के रूप में माना जाता है जैसे कि वे दूसरी पंक्ति में थे।

<CR>और <LF>वर्ण लाइन टर्मिनेटर्स कि एक स्ट्रिंग समाप्त, और स्ट्रिंग में शामिल नहीं हैं माना जाता है।

अन्य सभी एकल बाइट वर्णों को एक स्ट्रिंग में पूरी तरह से शामिल किया गया है।

यूनिकोड फ़ाइलों को खोजना
FINDSTR अधिकांश यूनिकोड (UTF-16, UTF-16LE, UTF-16BE, UTF-32) को ठीक से नहीं खोज सकता है क्योंकि यह nul बाइट्स की खोज नहीं कर सकता है और यूनिकोड में आमतौर पर कई nultes होते हैं।

हालाँकि, TYPE कमांड UTF-16LE को BOM के साथ एकल बाइट कैरेक्टर सेट में परिवर्तित करता है, इसलिए निम्न की तरह एक कमांड, BOM के साथ UTF-16LE के साथ काम करेगा।

type unicode.txt|findstr "search"

ध्यान दें कि यूनिकोड कोड बिंदु जो आपके सक्रिय कोड पृष्ठ द्वारा समर्थित नहीं हैं, उन्हें ?वर्णों में बदल दिया जाएगा ।

जब तक आपके खोज स्ट्रिंग में केवल ASCII है, तब तक UTF-8 को खोजना संभव है। हालाँकि, किसी भी मल्टी-बाइट UTF-8 वर्ण का कंसोल आउटपुट सही नहीं होगा। लेकिन अगर आप आउटपुट को किसी फ़ाइल पर रीडायरेक्ट करते हैं, तो परिणाम सही ढंग से UTF-8 एनकोडेड होगा। ध्यान दें कि यदि UTF-8 फ़ाइल में BOM है, तो BOM को पहली पंक्ति का एक भाग माना जाएगा, जो एक खोज को फेंक सकता है जो एक पंक्ति की शुरुआत से मेल खाती है।

यदि आप अपना खोज स्ट्रिंग किसी UTF-8 एन्कोडेड खोज फ़ाइल (BOM के बिना) में रखते हैं, और / G विकल्प का उपयोग करते हैं, तो मल्टी-बाइट UTF-8 वर्णों को खोजना संभव है।

लाइन का अंत
FINDSTR हर <LF> के तुरंत बाद लाइनों को तोड़ देता है। लाइन टूटने पर <CR> की उपस्थिति या अनुपस्थिति का कोई प्रभाव नहीं पड़ता है।


अपेक्षा के अनुसार लाइन ब्रेक करना , .रेगेक्स मेटाचैकर <CR> या <LF> से मेल नहीं खाएगा। लेकिन कमांड लाइन सर्च स्ट्रिंग का उपयोग करके लाइन ब्रेक को खोजना संभव है। दोनों <CR> और <LF> वर्णों को स्पष्ट रूप से मिलान किया जाना चाहिए। यदि एक बहु-पंक्ति मैच पाया जाता है, तो मैच की केवल 1 पंक्ति मुद्रित होती है। FINDSTR तब स्रोत में दूसरी पंक्ति में वापस दोगुना हो जाता है और फिर से खोज शुरू करता है - एक "आगे देखो" प्रकार की सुविधा।

TEXT.TXT मान लें कि ये सामग्री (यूनिक्स या विंडोज शैली हो सकती है)

A
A
A
B
A
A

फिर यह स्क्रिप्ट

@echo off
setlocal
::Define LF variable containing a linefeed (0x0A)
set LF=^


::Above 2 blank lines are critical - do not remove

::Define CR variable containing a carriage return (0x0D)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

setlocal enableDelayedExpansion
::regex "!CR!*!LF!" will match both Unix and Windows style End-Of-Line
findstr /n /r /c:"A!CR!*!LF!A" TEST.TXT

ये परिणाम देता है

1:A
2:A
5:A

/ G: FILE विकल्प का उपयोग करके लाइन ब्रेक के पार खोजना असंभव है क्योंकि <CR> या <LF> का मिलान करने का एकमात्र तरीका एक रेगीक्स वर्ण श्रेणी श्रेणी अभिव्यक्ति है जो EOL वर्णों को सैंडविच करता है।

  • [<TAB>-<0x0B>] <LF> से मेल खाता है, लेकिन यह <TAB> और <0x0B> से भी मेल खाता है

  • [<0x0C>-!] <CR> से मेल खाता है, लेकिन यह <0x0C> और से भी मेल खाता है!

    नोट - ऊपर मैं रेगी बाइट स्ट्रीम का प्रतीकात्मक निरूपण कर रहा हूँ क्योंकि मैं वर्णिक रूप से वर्णों का प्रतिनिधित्व नहीं कर सकता।

उत्तर नीचे के भाग 2 में जारी है ...


46
बकाया पूर्णता। अगर इंटरनेट पर केवल सभी उत्तर इस तरह थे।
माइक वीएन्स

1
हम साथ एक समस्या का सामना किया है addpath.batसे Q141344 और findstr, जो Win7 फांसी समस्या से संबंधित हो सकता कि ऊपर उल्लेख किया। मैंने एक चैट रूम बनाने की कोशिश की है और इसे ट्रैक करने के लिए, किसी की दिलचस्पी: chat.stackoverflow.com/rooms/13177/…
मैट

2
EDIT - एक्सपी पर डॉट्स के रूप में नियंत्रण वर्णों का प्रदर्शन प्रदर्शित करता है। इसके अलावा छोटे 8.3 नामों से उपजी दस्तावेज /Sऔर /Dविकल्प।
dbenham

1
EDIT - 1) फ़ाइल के भीतर / F द्वारा निर्दिष्ट फ़ाइल नाम: फ़ाइल को उद्धृत नहीं किया जाना चाहिए। 2) विस्तारित ASCII वर्णों का परिवर्तन कमांड लाइन पर दिए जाने पर खोज स्ट्रिंग और फ़ाइल नाम दोनों को प्रभावित करता है।
dbenham

1
EDIT - बग को जोड़ा गया जहां पाइप इनपुट की अंतिम पंक्ति को नजरअंदाज किया जाता है अगर इसमें एक भी वर्ण न हो<LF>
dbenham

64

उत्तर भाग 1 से जारी - मैंने 30,000 वर्ण उत्तर सीमा में भाग लिया है :-(

लिमिटेड रेगुलर एक्सप्रेशंस (regex) रेगुलर एक्सप्रेशन के
लिए FINDSTR सपोर्ट बेहद सीमित है। यदि यह सहायता दस्तावेज में नहीं है, तो यह समर्थित नहीं है।

इसके अलावा, regex अभिव्यक्तियों का समर्थन किया जाता है जो पूरी तरह से गैर-मानक तरीके से कार्यान्वित किया जाता है, जैसे कि परिणाम भिन्न हो सकते हैं और फिर grep या पर्ल जैसी किसी चीज़ से आने की उम्मीद की जाएगी।

रेगेक्स लाइन पोजिशन एंकर ^ और $
^ मेल इनपुट स्ट्रीम की शुरुआत के साथ-साथ किसी भी स्थिति के तुरंत बाद <LF>। चूंकि FINDSTR <LF> के बाद भी लाइनों को तोड़ता है, "^" का एक सरल रीजैक्स हमेशा एक फ़ाइल, यहां तक ​​कि एक बाइनरी फ़ाइल के भीतर सभी लाइनों से मेल खाएगा।

$<CR> से पहले किसी भी स्थिति से तुरंत मेल खाता है। इसका मतलब यह है कि एक रेक्सक्स खोज स्ट्रिंग युक्त $एक यूनिक्स शैली की टेक्स्ट फ़ाइल के भीतर कभी भी किसी भी रेखा से मेल नहीं खाता है, और न ही यह विंडोज टेक्स्ट फ़ाइल की अंतिम पंक्ति से मेल खाएगा यदि यह <CR> <LF> का EOL मार्कर गायब है।

नोट - जैसा कि पहले चर्चा की गई है, FINDSTR में पाइप किए गए और पुनर्निर्देशित इनपुट ने <CR><LF>जोड़ा हो सकता है जो स्रोत में नहीं है। जाहिर है कि यह एक रेगेक्स खोज को प्रभावित कर सकता है जो उपयोग करता है $

पहले ^या बाद के पात्रों के साथ कोई भी खोज स्ट्रिंग $हमेशा एक मैच खोजने में विफल रहेगी।

स्थितीय विकल्प / बी / ई / एक्स
स्थितीय विकल्प समान रूप से काम करते हैं ^और $, सिवाय इसके कि वे शाब्दिक खोज के लिए भी काम करते हैं।

/ B ^एक रेगेक्स खोज स्ट्रिंग की शुरुआत के समान है ।

/ E $एक रेगेक्स खोज स्ट्रिंग के अंत में समान कार्य करता है ।

/ X ^शुरुआत और $खोज के अंत में दोनों के समान है ।

रेगेक्स शब्द सीमा रेगेक्स में
\< पहला शब्द होना चाहिए। यदि कोई अन्य वर्ण इसे पसंद करता है, तो रेगेक्स कुछ भी मेल नहीं खाएगा। \<इनपुट के बहुत शुरुआत से मेल खाती है, एक लाइन की शुरुआत (एक <LF> के बाद स्थिति तुरंत), या किसी भी "गैर-शब्द" चरित्र के तुरंत बाद की स्थिति। अगले चरित्र को "शब्द" वर्ण नहीं होना चाहिए।

\>रेगेक्स में बहुत अंतिम शब्द होना चाहिए। यदि कोई अन्य वर्ण इसका अनुसरण करता है, तो रेगेक्स कुछ भी मेल नहीं खाएगा। \>या तो इनपुट के अंत से मेल खाती है, स्थिति तुरंत एक <सीआर> से पहले, या स्थिति तुरंत किसी भी "गैर-शब्द" चरित्र से पहले। पूर्ववर्ती चरित्र को "शब्द" वर्ण की आवश्यकता नहीं है।

यहाँ "गैर-शब्द" वर्णों की एक पूरी सूची है, जिसे दशमलव बाइट कोड के रूप में दर्शाया गया है। नोट - इस सूची को एक अमेरिकी मशीन पर संकलित किया गया था। मुझे नहीं पता कि अन्य भाषाओं का इस सूची पर क्या प्रभाव पड़ सकता है।

001   028   063   179   204   230
002   029   064   180   205   231
003   030   091   181   206   232
004   031   092   182   207   233
005   032   093   183   208   234
006   033   094   184   209   235
007   034   096   185   210   236
008   035   123   186   211   237
009   036   124   187   212   238
011   037   125   188   213   239
012   038   126   189   214   240
014   039   127   190   215   241
015   040   155   191   216   242
016   041   156   192   217   243
017   042   157   193   218   244
018   043   158   194   219   245
019   044   168   195   220   246
020   045   169   196   221   247
021   046   170   197   222   248
022   047   173   198   223   249
023   058   174   199   224   250
024   059   175   200   226   251
025   060   176   201   227   254
026   061   177   202   228   255
027   062   178   203   229

रेगेक्स चरित्र वर्ग पर्वतमाला [xy]
चरित्र वर्ग श्रेणियां अपेक्षित रूप से काम नहीं करती हैं। इस प्रश्न को देखें: मामले को ठीक से (कुछ परिस्थितियों में) क्यों नहीं पकड़ता है? , इस जवाब के साथ: https://stackoverflow.com/a/8767815/1012053

समस्या यह है कि FINDSTR वर्णों को उनके बाइट कोड मान (आमतौर पर ASCII कोड के रूप में सोचा जाता है) से नहीं टकराता है, लेकिन ASCII को केवल 0x00 - 0x7F से परिभाषित किया जाता है)। अधिकांश रेगेक्स कार्यान्वयन सभी ऊपरी मामले अंग्रेजी पूंजी पत्रों के रूप में [AZ] का इलाज करेंगे। लेकिन FINDSTR एक कोलाजेशन अनुक्रम का उपयोग करता है जो मोटे तौर पर SORT के काम करने के तरीके से मेल खाता है। इसलिए [AZ] में पूर्ण अंग्रेजी वर्णमाला, ऊपरी और निचले दोनों मामले ("ए" को छोड़कर), साथ ही साथ गैर-अंग्रेजी अल्फा वर्णों में शामिल हैं।

नीचे FINDSTR द्वारा समर्थित सभी वर्णों की एक पूरी सूची है, regex वर्ण वर्ग श्रेणियों को स्थापित करने के लिए FINDSTR द्वारा उपयोग किए जाने वाले कोलाजेशन अनुक्रम में सॉर्ट किया गया है। वर्णों को उनके दशमलव बाइट कोड मान के रूप में दर्शाया जाता है। मेरा मानना ​​है कि यदि कोड 437 का उपयोग करके वर्णों को देखा जाता है, तो कोलाजेशन अनुक्रम सबसे अधिक समझ में आता है। नोट - इस सूची को एक अमेरिकी मशीन पर संकलित किया गया था। मुझे नहीं पता कि अन्य भाषाओं का इस सूची पर क्या प्रभाव पड़ सकता है।

001
002
003
004
005
006
007
008
014
015
016
017
018           
019
020
021
022
023
024
025
026
027
028
029
030
031
127
039
045
032
255
009
010
011
012
013
033
034
035
036
037
038
040
041
042
044
046
047
058
059
063
064
091
092
093
094
095
096
123
124
125
126
173
168
155
156
157
158
043
249
060
061
062
241
174
175
246
251
239
247
240
243
242
169
244
245
254
196
205
179
186
218
213
214
201
191
184
183
187
192
212
211
200
217
190
189
188
195
198
199
204
180
181
182
185
194
209
210
203
193
207
208
202
197
216
215
206
223
220
221
222
219
176
177
178
170
248
230
250
048
172
171
049
050
253
051
052
053
054
055
056
057
236
097
065
166
160
133
131
132
142
134
143
145
146
098
066
099
067
135
128
100
068
101
069
130
144
138
136
137
102
070
159
103
071
104
072
105
073
161
141
140
139
106
074
107
075
108
076
109
077
110
252
078
164
165
111
079
167
162
149
147
148
153
112
080
113
081
114
082
115
083
225
116
084
117
085
163
151
150
129
154
118
086
119
087
120
088
121
089
152
122
090
224
226
235
238
233
227
229
228
231
237
232
234

रेगेक्स कैरेक्टर क्लास टर्म लिमिट और BUG
न केवल FINDSTR एक रेगेक्स के भीतर अधिकतम 15 कैरेक्टर क्लास टर्म्स तक सीमित है, यह लिमिट को पार करने के प्रयास को ठीक से हैंडल करने में विफल रहता है। 16 या अधिक वर्ण श्रेणी के शब्दों का उपयोग करने से एक इंटरैक्टिव विंडोज पॉप अप होता है, जिसमें कहा गया है "फाइंड स्ट्रिंग (क्यूजीआरईपी) उपयोगिता का एक समस्या का सामना करना पड़ा है और इसे बंद करने की आवश्यकता है। हम असुविधा के लिए खेद है।" संदेश पाठ विंडोज संस्करण के आधार पर थोड़ा भिन्न होता है। यहाँ एक FINDSTR का एक उदाहरण है जो विफल हो जाएगा:

echo 01234567890123456|findstr [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

इस बग की रिपोर्ट DosTips यूजर जूडागो ने यहां दी थी । एक्सपी, विस्टा और विंडोज 7 पर इसकी पुष्टि की गई है।

यदि वे बाइट कोड 0xFF (दशमलव 255) शामिल करते हैं, तो रेगेक्स खोजें विफल हो जाती हैं (और अनिश्चित काल तक लटका रह सकती हैं) बाइट कोड 0xFF (दशमलव 255)
शामिल है। यह विफल हो जाता है यदि बाइट कोड 0xFF को सीधे शामिल किया जाता है, या यदि यह वर्ण वर्ग श्रेणी के भीतर निहित है। याद रखें कि FINDSTR वर्ण वर्ग श्रेणियाँ बाइट कोड मान के आधार पर वर्णों को नहीं मिलाती हैं। चरित्र और वर्णों के <0xFF>बीच संबंध अनुक्रम में अपेक्षाकृत जल्दी दिखाई देता है । तो कोई भी वर्ण वर्ग श्रेणी जिसमें दोनों शामिल हैं और विफल हो जाएंगे।<space><tab><space><tab>

Windows संस्करण के आधार पर सटीक व्यवहार थोड़ा बदलता है। Windows 7 अनिश्चित रूप से हैंग हो जाता है अगर 0xFF शामिल है। XP लटका नहीं है, लेकिन यह हमेशा एक मैच खोजने में विफल रहता है, और कभी-कभी निम्नलिखित त्रुटि संदेश को प्रिंट करता है - "प्रक्रिया ने एक बिना पाइप के लिखने की कोशिश की।"

अब मेरे पास विस्टा मशीन तक पहुंच नहीं है, इसलिए मैं विस्टा पर परीक्षण नहीं कर पाया।

रेगेक्स बग: .और [^anySet]एंड-टू-फाइल से मेल खा सकता है
रेगेक्स .मेटा-चरित्र केवल <CR>या इसके अलावा किसी भी चरित्र से मेल खाना चाहिए <LF>। एक बग है जो इसे एंड-एंड-फाइल से मेल करने की अनुमति देता है यदि फ़ाइल में अंतिम पंक्ति द्वारा <CR>या समाप्त नहीं किया गया है <LF>। हालाँकि, .खाली फ़ाइल से मेल नहीं खाएगा।

उदाहरण के लिए, "test.txt" नाम की एक फ़ाइल, जिसमें एक भी लाइन होती है x, समाप्त किए बिना <CR>या <LF>, निम्नलिखित से मेल खाएगी:

findstr /r x......... test.txt

इस बग की पुष्टि XP और Win7 पर की गई है।

नकारात्मक चरित्र सेट के लिए भी यही सच लगता है। कुछ [^abc]- कुछ ऐसा होगा जो एंड-टू-फाइल से मेल खाएगा। सकारात्मक चरित्र सेट [abc]ठीक काम करने लगते हैं। मैंने केवल Win7 पर इसका परीक्षण किया है।


1
खोज भी छोटी फाइलों के साथ काम करते हुए छोटी गाड़ी है। फाइल्स> 2GB से हैंग होने का कारण बन सकता है। यह हमेशा नहीं होता है। बग की पुष्टि करने में मैंने एक फाइल खोजी जो 2.3GB की थी जो कि हैंग नहीं हुई। यह केवल एक फ़ाइल को खोजने पर भी लटका रहता है। वैकल्पिक हल पाइप के उत्पादन होता है typeमें findstr
अप्रसन्न

यह संभवतः सार्थक रूप से उल्लेख करने योग्य है जो findstrकई /c:खोज स्ट्रिंग का समर्थन करता है । मुझे पता है कि आपके जवाब यह प्रदर्शित करते हैं। लेकिन यह कुछ ऐसा है जो प्रलेखित नहीं है; और findstrकुछ वर्षों तक बिना उपयोग किए रहने के बाद मैं इस सुविधा को जानकर काफी हैरान था ।
अप्रकाशित

@CraigYoung - आप खोज स्ट्रिंग स्रोतों के बारे में सही हैं। मैंने अपना उत्तर संपादित किया, धन्यवाद।
डेबनहम

1
आगे की जाँच करने पर, यह LFआपके द्वारा प्रलेखित मुद्दे पर भिन्नता की तरह दिखता है । मुझे एहसास हुआ कि मेरी परीक्षा फ़ाइल समाप्त नहीं हुई LFक्योंकि मैंने copyइसे बनाने के लिए ऐपेंड मोड में उपयोग किया था। मैंने इस मुद्दे को एक उत्तर में प्रदर्शित करने के लिए एक कमांड लाइन सत्र रखा है ( stackoverflow.com/a/22943056/224704 )। ध्यान दें कि इनपुट पुनर्निर्देशित नहीं है, और फिर भी खोज लटका हुआ है। ठीक उसी खोज कमांड छोटी फ़ाइलों के साथ नहीं लटकी है जो इसी तरह खत्म नहीं होती है LF
अप्रभावित

1
नई खोज (Win7): findstr /R /C:"^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9]* [0-9]*\.[0-9]*"(15 चरित्र वर्गों) - ErrorLevel = -1073740791 (0xC0000409), त्रुटि संवाद खिड़की : Find String (QGREP) Utility has stopped working; एक वर्ग या दो मेटा अक्षर ( *\.) को हटाने के बाद , यह काम करता है ...
19

7

findstr कभी-कभी बड़ी फ़ाइलों को खोजते समय अनपेक्षित रूप से हैंग हो जाता है।

मैंने सटीक स्थितियों या सीमा आकारों की पुष्टि नहीं की है। मुझे संदेह है कि कोई भी फ़ाइल बड़ी 2GB जोखिम में हो सकती है।

मुझे इसके साथ मिश्रित अनुभव हुए हैं, इसलिए यह केवल फ़ाइल आकार से अधिक है। ऐसा लगता है कि यह XP और Windows 7 पर FINDSTR हैंग पर भिन्नता हो सकती है यदि पुनर्निर्देशित इनपुट LF के साथ समाप्त नहीं होता है , लेकिन जैसा कि इनपुट पुनर्निर्देशित नहीं होने पर यह विशेष समस्या प्रकट होती है ।

निम्न कमांड लाइन सत्र (विंडोज 7) दर्शाता है कि findstr3 जीबी फ़ाइल खोजते समय कैसे लटका हो सकता है।

C:\Data\Temp\2014-04>echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890> T100B.txt

C:\Data\Temp\2014-04>for /L %i in (1,1,10) do @type T100B.txt >> T1KB.txt

C:\Data\Temp\2014-04>for /L %i in (1,1,1000) do @type T1KB.txt >> T1MB.txt

C:\Data\Temp\2014-04>for /L %i in (1,1,1000) do @type T1MB.txt >> T1GB.txt

C:\Data\Temp\2014-04>echo find this line>> T1GB.txt

C:\Data\Temp\2014-04>copy T1GB.txt + T1GB.txt + T1GB.txt T3GB.txt
T1GB.txt
T1GB.txt
T1GB.txt
        1 file(s) copied.

C:\Data\Temp\2014-04>dir
 Volume in drive C has no label.
 Volume Serial Number is D2B2-FFDF

 Directory of C:\Data\Temp\2014-04

2014/04/08  04:28 PM    <DIR>          .
2014/04/08  04:28 PM    <DIR>          ..
2014/04/08  04:22 PM               102 T100B.txt
2014/04/08  04:28 PM     1 020 000 016 T1GB.txt
2014/04/08  04:23 PM             1 020 T1KB.txt
2014/04/08  04:23 PM         1 020 000 T1MB.txt
2014/04/08  04:29 PM     3 060 000 049 T3GB.txt
               5 File(s)  4 081 021 187 bytes
               2 Dir(s)  51 881 050 112 bytes free
C:\Data\Temp\2014-04>rem Findstr on the 1GB file does not hang

C:\Data\Temp\2014-04>findstr "this" T1GB.txt
find this line

C:\Data\Temp\2014-04>rem On the 3GB file, findstr hangs and must be aborted... even though it clearly reaches end of file

C:\Data\Temp\2014-04>findstr "this" T3GB.txt
find this line
find this line
find this line
^C
C:\Data\Temp\2014-04>

ध्यान दें, मैंने एक हेक्स संपादक में सत्यापित किया है कि सभी लाइनें समाप्त हो गई हैं CRLF। एकमात्र विसंगति यह है कि जिस तरह से काम करता है उसके0x1A कारण फ़ाइल को समाप्त कर दिया जाता है । हालाँकि, ध्यान दें कि यह विसंगति "छोटी" फाइलों पर समस्या पैदा नहीं करती हैcopy

अतिरिक्त परीक्षण के साथ मैंने निम्नलिखित की पुष्टि की है:

  • द्विआधारी फ़ाइलों के लिए विकल्प के copyसाथ उपयोग /bकरने से 0x1Aचरित्र को जोड़ने से रोकता है , और findstr3 जीबी फ़ाइल पर लटका नहीं है।
  • एक अलग चरित्र के साथ 3 जीबी फ़ाइल को समाप्त करने से भी findstrलटका होता है।
  • 0x1Aचरित्र एक "छोटे" फ़ाइल पर किसी भी समस्याओं का कारण नहीं है। (इसी तरह अन्य समाप्ति पात्रों के लिए।)
  • समस्या को हल करने के CRLFबाद जोड़ना 0x1A। ( LFअपने आप संभवत: पर्याप्त होगा।)
  • typeफ़ाइल को findstrबिना लटके काम करने के लिए पाइप का उपयोग करना । (यह typeया तो एक साइड इफेक्ट के कारण हो सकता है या |जो अतिरिक्त लाइन ऑफ लाइन सम्मिलित करता है।)
  • पुनर्निर्देशित इनपुट का उपयोग <भी findstrहैंग करने का कारण बनता है। लेकिन यह अपेक्षित है; dbenham की पोस्ट में बताया गया है : "पुनर्निर्देशित इनपुट को समाप्त होना चाहिए LF"

1
+1, मैं अपने Win7 मशीन पर समस्या की पुष्टि करने में सक्षम हूं। जब अंतिम वर्ण नहीं था तो आकार में ठीक 2GiB की एक फ़ाइल लटका दी गई थी <LF>। एक फाइल दो बाइट्स छोटी नहीं लटकी। दर्दनाक!
डेबनहम

6

जब कई कमांड कोष्ठकों में संलग्न होते हैं और पूरे ब्लॉक में पुनर्निर्देशित फाइलें होती हैं:

< input.txt (
   command1
   command2
   . . .
) > output.txt

... तब तक फाइलें खुली रहती हैं जब तक कि ब्लॉक में कमांड सक्रिय रहती हैं, इसलिए कमांड पुनर्निर्देशित फाइलों के फाइल पॉइंटर को स्थानांतरित कर सकते हैं। MORE और FIND दोनों कमांड्स Stdin फाइल पॉइंटर को प्रोसेस करने से पहले फाइल की शुरुआत में ले जाती हैं, इसलिए उसी फाइल को ब्लॉक के अंदर कई बार प्रोसेस किया जा सकता है। उदाहरण के लिए, यह कोड:

more < input.txt >  output.txt
more < input.txt >> output.txt

... इस एक से एक ही परिणाम का उत्पादन:

< input.txt (
   more
   more
) > output.txt

यह कोड:

find    "search string" < input.txt > matchedLines.txt
find /V "search string" < input.txt > unmatchedLines.txt

... इस एक से एक ही परिणाम का उत्पादन:

< input.txt (
   find    "search string" > matchedLines.txt
   find /V "search string" > unmatchedLines.txt
)

FINDSTR अलग है; यह अपनी वर्तमान स्थिति से स्टडिन फ़ाइल पॉइंटर को स्थानांतरित नहीं करता है । उदाहरण के लिए, यह कोड खोज लाइन के बाद एक नई लाइन सम्मिलित करता है:

call :ProcessFile < input.txt
goto :EOF

:ProcessFile
   rem Read the next line from Stdin and copy it
   set /P line=
   echo %line%
   rem Test if it is the search line
   if "%line%" neq "search line" goto ProcessFile
rem Insert the new line at this point
echo New line
rem And copy the rest of lines
findstr "^"
exit /B

हम एक सहायक कार्यक्रम की सहायता से इस सुविधा का अच्छा उपयोग कर सकते हैं जो हमें एक पुनर्निर्देशित फ़ाइल के फ़ाइल पॉइंटर को स्थानांतरित करने की अनुमति देता है, जैसा कि इस उदाहरण में दिखाया गया है ।

इस व्यवहार की रिपोर्ट सबसे पहले जेब ने इस पोस्ट में दी थी ।


EDIT 2018-08-18 : नई FINDSTR बग की सूचना दी

FINDSTR कमांड में एक अजीब बग होता है जो तब होता है जब इस कमांड का उपयोग वर्णों को दिखाने के लिए किया जाता है और ऐसे कमांड का आउटपुट CON डिवाइस पर रीडायरेक्ट होता है। रंग में पाठ दिखाने के लिए FINDSTR कमांड का उपयोग करने के विवरण के लिए, इस विषय को देखें ।

जब FINDSTR कमांड के इस फॉर्म के आउटपुट को CON पर रीडायरेक्ट किया जाता है, तो टेक्स्ट के वांछित रंग में आउटपुट के बाद कुछ अजीब होता है: सभी टेक्स्ट के आउटपुट के बाद "अदृश्य" अक्षर के रूप में होता है, हालांकि एक अधिक सटीक वर्णन यह है कि टेक्स्ट है ब्लैक बैकग्राउंड पर ब्लैक टेक्स्ट के रूप में आउटपुट। यदि आप पूरे स्क्रीन के अग्रभूमि और पृष्ठभूमि के रंगों को रीसेट करने के लिए COLOR कमांड का उपयोग करते हैं तो मूल पाठ दिखाई देगा। हालाँकि, जब पाठ "अदृश्य" होता है, तो हम SET / P कमांड निष्पादित कर सकते हैं, इसलिए दर्ज किए गए सभी अक्षर स्क्रीन पर दिखाई नहीं देंगे। इस व्यवहार का उपयोग पासवर्ड दर्ज करने के लिए किया जा सकता है।

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

2

फ़ाइल नाम के भीतर डैश (-) या em डैश (-) का उपयोग करते समय मैं पहले उत्तर में खोज करने के लिए डेटा के स्रोत के बारे में एक बग रिपोर्ट करना चाहूंगा ।

विशेष रूप से, यदि आप पहले विकल्प का उपयोग करने वाले हैं - फ़ाइल नाम के रूप में निर्दिष्ट फ़ाइल नाम नहीं मिलेगा। जैसे ही आप या तो विकल्प 2 का उपयोग करते हैं - स्टड पुनर्निर्देशन के माध्यम से या 3 - एक पाइप से डेटा स्ट्रीम , फ़ाइल मिल जाएगा।

उदाहरण के लिए, यह सरल बैच स्क्रिप्ट:

echo off
chcp 1250 > nul
set INTEXTFILE1=filename with – dash.txt
set INTEXTFILE2=filename with — dash.txt

rem 3 way of findstr use with en dashed filename
echo.
echo Filename with en dash:
echo.
echo 1. As argument
findstr . "%INTEXTFILE1%"
echo.
echo 2. As stdin via redirection
findstr . < "%INTEXTFILE1%"
echo.
echo 3. As datastream from a pipe
type "%INTEXTFILE1%" | findstr .
echo.
echo.
rem The same set of operations with em dashed filename
echo Filename with em dash:
echo.
echo 1. As argument
findstr . "%INTEXTFILE2%"
echo.
echo 2. As stdin via redirection
findstr . < "%INTEXTFILE2%"
echo.
echo 3. As datastream from a pipe
type "%INTEXTFILE2%" | findstr .
echo.

pause

प्रिंट होगा:

एन डैश के साथ नाम:

  1. तर्क के रूप में
    FINDSTR: के साथ फ़ाइल नाम नहीं खोल सकता - dash.txt

  2. जैसा कि पुनर्निर्देशन के माध्यम से
    मैं एक एन डैश के साथ फाइल हूँ।

  3. पाइप से डेटास्ट्रीम के रूप में
    मैं एक एन डैश के साथ फाइल हूँ।

एम डैश के साथ फाइलनाम:

  1. तर्क के रूप में
    FINDSTR: के साथ फ़ाइल नाम नहीं खोल सकता - dash.txt

  2. रीडायरेक्शन के माध्यम से स्टैडेन के रूप में मैं एम डैश के साथ फाइल कर
    रहा हूं।

  3. पाइप से डेटास्ट्रीम के रूप में
    मैं एक एम डैश के साथ फाइल हूं।

आशा करता हूँ की ये काम करेगा।

म।


1
नमस्कार, जब आपकी टिप्पणियाँ सही हो सकती हैं, तो मुझे यकीन नहीं है कि वे वास्तविक प्रश्न को संबोधित नहीं करेंगे।
वाई हा ली

मेरा मानना ​​है कि यह एक यूनिकोड मुद्दा है, जिसका FINDSTR समर्थन नहीं करता है। CMD.EXE पुनर्निर्देशन ठीक से यूनिकोड के साथ एक फ़ाइल नाम खोल सकता है, जैसा कि TYPE कमांड कर सकता है। लेकिन कहीं-कहीं लाइन के साथ, FINDSTR एन-डैश और एम-डैश दोनों को एक सामान्य डैश में कनवर्ट करता है, और निश्चित रूप से ओएस को वह नाम नहीं मिल सकता है। यदि आप एन-डैश और / या एम-डैश के लिए डैश की जगह एक और फ़ाइल बनाते हैं, तो एन-डैश या एम-डैश वाले नाम के साथ प्रदान किए जाने पर FINDSTR डैश फ़ाइल खोजेगा।
डेन्थम

मैं इस मुद्दे को बग के बजाय सीमा के रूप में वर्गीकृत करूंगा।
डेन्हम

वास्तव में, यह एक यूनिकोड मुद्दा नहीं है क्योंकि यह ASCII बढ़ाया गया है। मैंने पहले से ही कमांड लाइन के मापदंडों - विस्तारित ASCII परिवर्तन के लिए शीर्ष चरित्र सीमाओं के तहत अपने मूल उत्तर में इस मुद्दे को प्रलेखित किया । FINDSTR ने कई ASCII कोड को "संबंधित" सही ASCII में बदल दिया, जिसमें en-dash और em-dash शामिल हैं।
डेबनहम

1

findstrआदेश सेट ErrorLevel(या बाहर निकलने के कोड) निम्न मानों में से एक है, यह देखते हुए कोई अवैध या असंगत स्विच और कोई खोज स्ट्रिंग लागू लंबाई सीमा पार कर देखते हैं कि करने के लिए:

  • 0 जब सभी निर्दिष्ट फ़ाइलों में कम से कम एक मैच एक पंक्ति में सामना किया जाता है;
  • 1 अन्यथा;

एक पंक्ति में एक मैच शामिल माना जाता है जब:

  • कोई /Vविकल्प नहीं दिया गया है और खोज अभिव्यक्ति कम से कम एक बार होती है;
  • /Vविकल्प दिया जाता है और खोज अभिव्यक्ति नहीं होती है;

इसका मतलब यह है कि /Vविकल्प भी रिटर्न को बदल देता है ErrorLevel, लेकिन यह इसे वापस नहीं करता है!

उदाहरण के लिए, जब आपको test.txtदो पंक्तियों के साथ एक फ़ाइल मिली है , जिसमें से एक में स्ट्रिंग है, textलेकिन दूसरा नहीं है, दोनों एक findstr "text" "test.txt"और findstr /V "text" "test.txt"एक वापसी करते ErrorLevelहैं 0

मूल रूप से आप कह सकते हैं: यदि findstrकम से कम एक पंक्ति में रिटर्न ErrorLevelहोता है 0, तो अन्य के लिए निर्धारित किया जाता है 1

ध्यान दें कि /Mविकल्प ErrorLevelमूल्य को प्रभावित नहीं करता है , यह सिर्फ आउटपुट को बदल देता है।

(पूर्णता के लिए: findआदेश/V विकल्प के संबंध में ठीक उसी तरह व्यवहार करता है और ErrorLevel, /Cविकल्प प्रभावित नहीं करता है ErrorLevel)


1

FINDSTR का रंग बग है जिसे मैंने /superuser/1535810/is-there-a-better-way-to-mitigate-this-obscure-color-bug-when-piping-to पर हल और हल किया है -findstr / 1538802? noredirect = 1 # comment2339443_1538802

उस थ्रेड को संक्षेप में बताने के लिए, बग यह है कि यदि इनपुट को कोड के एक कोष्ठक ब्लॉक के भीतर FINDSTR में पाइप किया गया है, तो इनलाइन ANSI एस्केप कोलकोड्स बाद में निष्पादित कमांड में काम करना बंद कर देते हैं। इनलाइन कलरकोड्स का एक उदाहरण है: echo %magenta%Alert: Something bad happened%yellow%(जहां मैजेंटा और पीले रंग के संस्करण पहले से परिभाषित किए गए हैं। संबंधित फ़ाइल एएनएसआई एस्केप कोलकोड के रूप में)।

मेरा प्रारंभिक समाधान FINDSTR के बाद डू-नॉट सबरूटिन को कॉल करना था। किसी भी तरह कॉल या रिटर्न "रीसेट" जो भी रीसेट करने की आवश्यकता है।

बाद में मैंने एक और समाधान खोजा जो संभवतः अधिक कुशल है: निम्न उदाहरणों में, कोष्ठक के भीतर FINDSTR वाक्यांश रखें: echo success | ( FINDSTR /R success ) कोड के नेस्टेड ब्लॉक के भीतर FINDSTR वाक्यांश रखने से FINDSTR का कलरकोड बग अलग हो जाता है, इसलिए यह प्रभावित नहीं होगा कि नेस्टेड के बाहर क्या है। खंड मैथा। शायद यह तकनीक कुछ अन्य अवांछित अवांछित साइड इफेक्ट्स को भी हल कर देगी


शानदार खोज। लेकिन आपके नियमों को सरल बनाया जा सकता है (कम से कम मेरे उद्यम विंडोज 10 मशीन पर)। FINDSTR सभी कंसोल एस्केप अनुक्रमों को एक ही कमांड ब्लॉक में बाद के कमांड के लिए काम करने से रोकता है। अगर FINDSTR पाइप, रीडायरेक्टेड इनपुट, या फ़ाइल को पढ़ता है तो इससे कोई फर्क नहीं पड़ता। भागने के क्रम की विफलता रंग कोड तक सीमित नहीं है। एक कमांड ब्लॉक कोष्ठक के भीतर आदेशों का कोई भी सेट है, और / या कमांड को &, &&, या के माध्यम से समाप्‍त किया जाता है
dbenham

@ दांभम: समस्या का अच्छा सामान्यीकरण। क्या आप जानते हैं कि क्या मेरा समाधान - कोष्ठक के अंदर FINDSTR वाक्यांश का घोंसला बनाना - सामान्य मामले में भी काम करता है? और क्या आप जानते हैं कि मेरे समाधान का कोई अवांछनीय दुष्प्रभाव है या नहीं?
डोलोरेस स्टीवंस

मैंने कोई संपूर्ण परीक्षण नहीं किया, लेकिन हां, नेस्टेड कोष्ठक एक सामान्य समाधान लगता है, और मैं किसी भी संभावित अवांछनीय दुष्प्रभाव के बारे में नहीं सोच सकता।
debham

-1

/ कई निर्देशिकाओं के लिए डी टिप: खोज स्ट्रिंग से पहले अपनी निर्देशिका सूची डालें। ये सभी काम:

findstr /D:dir1;dir2 "searchString" *.*
findstr /D:"dir1;dir2" "searchString" *.*
findstr /D:"\path\dir1\;\path\dir2\" "searchString" *.*

जैसा कि अपेक्षित था, यदि आप निर्देशिकाओं को प्रारंभ नहीं करते हैं, तो पथ स्थान के सापेक्ष है \"यदि निर्देशिका नाम में कोई स्थान नहीं है, तो पथ को घेरना वैकल्पिक है। अंत \वैकल्पिक है। स्थान के आउटपुट में आप जो भी रास्ता देंगे उसे शामिल करेंगे। यह निर्देशिका सूची के साथ या उसके बिना काम करेगा "


मुझे यहाँ कुछ भी नहीं दिखता है। अंतर्निहित मदद में / डी विकल्प का वर्णन किया गया है। यह FINDSTR का उपयोग करने के सामान्य सुझावों के लिए एक प्रश्न नहीं है। यह अनिर्दिष्ट सुविधाओं, सीमाओं और / या कीड़े को सूचीबद्ध करने के लिए कड़ाई से इरादा है।
डेबनहम

1
@dbenham सच है कि यह वास्तव में अनिर्धारित नहीं है, लेकिन मैंने पाया कि मुझे जो परिणाम चाहिए थे, उसे पाने के लिए मैंने डिस्ट्रॉयर के साथ डिकर किया था और साझा कर रहा था कि मुझे क्या मिला डीआईडी ​​का काम इसलिए लोग समय के साथ काम करने वाले आदेशों के साथ प्रयोग करने में समय बर्बाद नहीं करेंगे। hth (मुझे दुख है कि आप मेरे इनपुट को नापसंद करते हैं - यह केवल रचनात्मक होने का इरादा था)
गॉर्डन

IMHO / D स्विच को स्पष्ट रूप से अंतर्निहित मदद में वर्णित किया गया है: /D:dirlist Search a semicolon-delimited list of directoriesऔर इसे खोज स्ट्रिंग से पहले रखा गया है, इसलिए मुझे समझ में नहीं आता है कि वास्तव में वही है जो आपने / D स्विच के बारे में "पाया" (और जो "कमांड्स" हैं) काम नहीं करते ") ...
आकिनी

कई भाषाओं में @Aacini, विशेषताओं का क्रम मायने नहीं रखता है। मैं findstrसूची / डी के लिए प्रलेखन को पहले समझता हूं । हाँ, दस्तावेज़ के दस्तावेज होने के साथ मेरा कोई तर्क नहीं है, यह सिर्फ गोच के बारे में प्रलेखित नहीं है कि विशेषताओं का क्रम मायने रखता है। मैं बहुत कम कमांडलाइन काम करता हूं, इसलिए जब मैं एक कमांड कोब कर रहा था, तो मुझे पता नहीं था कि आदेश में कोई फर्क पड़ा है, मैं सिर्फ विशेषताओं को जोड़ रहा था क्योंकि मैं उन्हें मिला (और वर्णानुक्रम में, सी पूर्व डी)। मैं वास्तव में निराश हो रहा था और अपने "पाया" अनुभव को किसी और के लिए साझा किया है जो कमांडलाइन के साथ ज्यादा काम नहीं करता है।
गॉर्डन

1
वैकल्पिक विशेषताओं का क्रम आमतौर पर मायने नहीं रखता। findstrप्रलेखन निर्दिष्ट करते हैं कि stringsहिस्सा है नहीं वैकल्पिक और आप के बाद यह जगह चाहिए कि वैकल्पिक विशेषताओं और से पहले वैकल्पिक फ़ाइल नाम सूची। यदि "आपका पाया" यह है कि एक कमांड का उपयोग किए बिना इसके उपयोग प्रारूप का अनुसरण करने से त्रुटि होती है, तो ऐसे बिंदु को अच्छी तरह से प्रलेखित किया जाता है। कमांड सिंटैक्स देखें : "सिंटैक्स उस क्रम में दिखाई देता है जिसमें आपको एक कमांड टाइप करना होगा और इसके बाद आने वाले कोई भी पैरामीटर"
Aacini
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.