fc.exe
पाठ की तुलना करने के लिए बेहतर है क्योंकि यह काम करने के लिए डिज़ाइन किया गया है जैसे * nix diff, अर्थात क्रमिक रूप से लाइनों की तुलना, वास्तविक अंतर दिखाते हुए और यदि अलग-अलग वर्गों की लंबाई अलग-अलग हो तो पुन: सिंक्रनाइज़ करने की कोशिश करना। इसमें कुछ उपयोगी नियंत्रण विकल्प (टेक्स्ट / बाइनरी, केस सेंसिटिविटी, लाइन नंबर्स, रेज़िन सिंक्रोनाइजेशन लेंथ, मिसमैच बफर साइज़) और एक्जिट स्टेटस (-1 बैड सिंटैक्स, 0 फाइल्स वही, 1 फाइल्स डिफरेंट, 2 फाइल मिसिंग) प्रदान करता है। एक (बहुत) पुरानी डॉस उपयोगिता होने के नाते, इसकी कुछ सीमाएं हैं। सबसे विशेष रूप से, यह स्वचालित रूप से यूनिकोड के साथ काम नहीं करता है, ASCII वर्णों के 0 MSB को एक लाइन टर्मिनेटर के रूप में मानता है, इसलिए फ़ाइल 1 वर्ण रेखाओं का अनुक्रम बन जाती है (@kennycoc: BOT फ़ाइलों को निर्दिष्ट करने के लिए / U विकल्प का उपयोग करें यूनिकोड, WinXP आगे की तरफ हैं) ) और इसमें 128 अक्षरों का एक हार्ड लाइन बफर आकार (128 बाइट्स ASCII) है,
तुलना-वस्तु यह निर्धारित करने के लिए डिज़ाइन की गई है कि क्या 2 ऑब्जेक्ट सदस्य-वार समान हैं। यदि वस्तुएं संग्रह हैं तो उन्हें SETS के रूप में माना जाता है (देखें मदद-तुलना-वस्तु देखें), यानी बिना डुप्लिकेट के UNORDERED संग्रह। 2 सेट बराबर हैं यदि उनके पास ऑर्डर या दोहराव के बावजूद समान सदस्य आइटम हैं। यह गंभीर रूप से मतभेदों के लिए पाठ फ़ाइलों की तुलना करने के लिए इसकी उपयोगिता को सीमित करता है। सबसे पहले, डिफ़ॉल्ट व्यवहार तब तक मतभेदों को एकत्र करता है जब तक कि पूरी वस्तु (फ़ाइल = सरणी का तार) की जाँच नहीं हो जाती है और इस प्रकार अंतर की स्थिति के बारे में जानकारी खो जाती है और अस्पष्ट हो जाती है कि कौन से अंतर जोड़े गए हैं (और एक सेट के लिए लाइन नंबर की कोई अवधारणा नहीं है। तार का)। -Synchwindow 0 का उपयोग करने से अंतर उत्पन्न होने का कारण होगा, लेकिन इसे फिर से सिंक्रनाइज़ करने की कोशिश करने से रोकता है, यदि एक फ़ाइल में एक अतिरिक्त रेखा है, तो बाद की पंक्ति तुलना विफल हो सकती है, भले ही फाइलें अन्यथा समान हों (जब तक कि कोई प्रतिपूरक न हो अन्य फाइल में अतिरिक्त लाइन जिससे मिलान लाइनों को साकार किया जाता है)। हालाँकि, पॉवरशेल बेहद बहुमुखी है और इस कार्यक्षमता का उपयोग करके एक उपयोगी फ़ाइल की तुलना की जा सकती है, जो पर्याप्त जटिलता की लागत और फाइलों की सामग्री पर कुछ प्रतिबंधों के साथ होती है। यदि आपको लंबी (> 127 वर्ण) लाइनों के साथ पाठ फ़ाइलों की तुलना करने की आवश्यकता है और जहां लाइनें अधिकतर मेल खाती हैं:
diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
जहां xx सबसे लंबी रेखा + 9 की लंबाई है
व्याख्या
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
फ़ाइल की सामग्री मिलती है और इसे अलग करने के लिए पास करने से पहले लाइन नंबर और फ़ाइल इंडिकेटर (<< या >>) को प्रत्येक लाइन (प्रारूप स्ट्रिंग ऑपरेटर का उपयोग करके) को प्रीपेंड करता है।
-property { $_.substring(9) }
पहले 9 वर्णों (जो लाइन नंबर और फ़ाइल इंडिकेटर हैं) को अनदेखा करते हुए प्रत्येक जोड़ी की वस्तुओं (तारों) की तुलना करने के लिए अलग-अलग बताता है। यह एक संपत्ति के नाम के बजाय एक गणना की गई संपत्ति (एक स्क्रिप्ट ब्लॉक का मूल्य) निर्दिष्ट करने की क्षमता का उपयोग करता है।
-passthru
अलग-अलग इनपुट ऑब्जेक्ट (जिसमें लाइन नंबर और फ़ाइल इंडिकेटर शामिल हैं) को आउटपुट ऑब्जेक्ट्स की तुलना में भिन्न करने के लिए अलग-अलग कारण होते हैं (जो नहीं करते हैं)।
sort-object
फिर सभी लाइनों को अनुक्रम में वापस डालता है।
आउट-स्ट्रिंग, ट्रंकेशन से बचने के लिए बड़ी चौड़ाई निर्दिष्ट करके स्क्रीन चौड़ाई (जैसा कि मार्क टॉवर्सैप द्वारा नोट किया गया है) को फिट करने के लिए आउटपुट का डिफ़ॉल्ट ट्रंकेशन रोकता है। आम तौर पर, इस आउटपुट को एक फाइल में डाला जाएगा, जिसे बाद में स्क्रॉलिंग एडिटर (जैसे नोटपैड) का उपयोग करके देखा जाएगा।
ध्यान दें
लाइन नंबर प्रारूप {0,6} एक सही औचित्य देता है, अंतरिक्ष गद्देदार 6 वर्ण लाइन नंबर (सॉर्टिंग के लिए)। यदि फ़ाइलों में 999,999 से अधिक लाइनें हैं, तो बस स्वरूप को व्यापक बनाने के लिए बदलें। इसके लिए $_.substring
पैरामीटर (पंक्ति संख्या चौड़ाई से 3 अधिक) और आउट-स्ट्रिंग xx मान (अधिकतम पंक्ति लंबाई + $_.substring
पैरामीटर) को बदलने की भी आवश्यकता होती है ।