मैं विंडोज पॉवर्सशेल में दो पाठ फ़ाइलों को कैसे अलग करूं?


96

मेरे पास दो पाठ फाइलें हैं और विंडोज पॉवर्सशेल का उपयोग करके उन दोनों के बीच अंतर खोजना चाहते हैं। क्या यूनिक्स डिफ टूल के समान कुछ उपलब्ध है? या कोई और तरीका है जिस पर मैंने विचार नहीं किया है?

मैंने तुलना-वस्तु की कोशिश की है, लेकिन इस क्रिप्टोकरेंसी को प्राप्त करें:

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=

जवाबों:


101

यह खुद पता लगा। क्योंकि Powershell टेक्स्ट के बजाय .net ऑब्जेक्ट्स के साथ काम करता है, आपको टेक्स्ट फ़ाइलों की सामग्री को उजागर करने के लिए get-content का उपयोग करने की आवश्यकता होती है। इसलिए प्रश्न में मैं जो करने की कोशिश कर रहा था, उसे करने के लिए:

compare-object (get-content one.txt) (get-content two.txt)

1
जब मैंने दो फ़ाइलों की तुलना करने की कोशिश की तो मैं बहुत हैरान था: संख्याओं का एक अनसुलझा सरणी, और उन्हें क्रमबद्ध करने के बाद संख्याओं का एक ही सरणी। फ़ाइलों के बहुत अलग होने के बावजूद कोई आउटपुट नहीं है। जाहिर है, तुलना-वस्तु आदेश पर विचार नहीं करती है।
cgmb

1
@cgmb - आप इसे -SyncWindow 0ठीक करने के लिए उपयोग कर सकते हैं , मुझे विश्वास है, हालांकि मैं अनिश्चित हूं अगर यह केवल हाल ही में पेश किया गया है। यह विशेष रूप से इसके बारे में स्मार्ट नहीं है, हालांकि।
जेम्स रस्किन

32

इसे लिखने का एक सरल तरीका है:

diff (cat file1) (cat file2)

15
पावरशेल में डिफेंस-ऑब्जेक्ट और गेट-कंटेंट के लिए डिफ और कैट सिर्फ उपनाम हैं। यह एक ही बात है।
शॉन मेल्टन

4
यह स्वीकार किए गए उत्तर के समान होने के बावजूद, मुझे इस वाक्यविन्यास का अधिक उपयोग करना पसंद है
एलियाह डब्ल्यू.गैगन

ध्यान दें कि यह * nix की तरह व्यवहार नहीं करता है diff, जैसा कि अन्य उत्तर यहाँ ध्यान दें। और जब मैंने catगलत आउटपुट प्राप्त करने के स्थान पर अधिक जटिल अभिव्यक्ति का उपयोग किया , तो मैं PowerShell में ऐसा करने से बचने के लिए अन्य लोगों में शामिल होऊंगा यदि आप * nix से आते हैं।
निकोलय

29

या आप fcइस तरह डॉस कमांड का उपयोग कर सकते हैं (यह दोनों फाइलों के आउटपुट को दिखाता है ताकि आपको अंतरों के लिए स्कैन करना पड़े):

fc.exe filea.txt fileb.txt > diff.txt

fcस्वरूप-कस्टम cmdlet के लिए एक उपनाम है ताकि कमांड को दर्ज करना सुनिश्चित करेंfc.exe । कृपया ध्यान दें कि कई डॉस उपयोगिताएँ UTF-8 एन्कोडिंग को नहीं संभालती हैं।

आप एक सीएमडी प्रक्रिया भी शुरू कर सकते हैं और उसके fcभीतर चल सकते हैं।

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

यह PowerShell को उद्धरणों में मापदंडों का उपयोग करके 'cmd' प्रोग्राम के साथ एक प्रक्रिया शुरू करने का निर्देश देता है। उद्धरण में, कमांड चलाने और समाप्त करने के लिए '/ c' cmd विकल्प है। प्रक्रिया में cmd ​​द्वारा चलाने के लिए वास्तविक आदेश fc filea.txt fileb.txtआउटपुट को फ़ाइल पर पुनर्निर्देशित कर रहा है diff.txt

आप fc.exeशक्तियां के भीतर से डॉस का उपयोग कर सकते हैं ।


2
+1 को DOS ^ _ ^ के लिए लाने के लिए
Jeff Bridgman

1
"fc" मेरे लिए काम नहीं कर रहा था, और मुझे नहीं लगा कि मुझे इसे "fc.exe" के रूप में निर्दिष्ट करना है ताकि इसे फॉर्मेट-कस्टम से अलग किया जा सके। ठीक वही जो मेरे द्वारा खोजा जा रहा था। धन्यवाद।
Xonatron

हो सकता है कि मैं पूरी तरह से परोपकारी हूं, लेकिन यह मेरे लिए बहुत अधिक उपयोगी है। इसने मेरी समस्या को बहुत अच्छी तरह से हल किया।
ए जे।

केवल समस्या यह है कि यह यूनिकोड से नफरत करता है।
१२:

7

diff on * nix शेल का हिस्सा नहीं है, बल्कि एक अलग एप्लीकेशन है।

क्या कोई कारण है जो आप पावरशेल के तहत diff.exe का उपयोग नहीं कर सकते हैं?

आप UnxUtils पैकेज ( http://unxutils.sourceforge.net/ ) से एक संस्करण डाउनलोड कर सकते हैं


10
क्योंकि PowerShell अभी शामिल है, डाउनलोड और इंस्टॉल करने के लिए कुछ भी नहीं है।
ब्राच जूल

मैंने अभी उपयोग करना समाप्त कर दिया है git diff, क्योंकि मेरे पास पहले से ही यह स्थापित था। मेरे द्वारा अपेक्षित उत्पादन का न तो उत्पादन किया गया fc.exeऔर न ही Compare-Object
रेज़िएल

4

तुलना-वस्तु (उर्फ डिफरेंट अलियास) दयनीय है अगर आप उम्मीद करते हैं कि यह यूनिक्स डिफरेंशियल जैसा कुछ व्यवहार करे। मैंने diff (gc file1) (gc file2) की कोशिश की, और यदि कोई रेखा बहुत लंबी है, तो मैं वास्तविक अंतर नहीं देख सकता और अधिक महत्वपूर्ण बात, मैं यह नहीं बता सकता कि कौन सी पंक्ति संख्या कितनी भिन्न है।

जब मैं -passthru को जोड़ने की कोशिश करता हूं, तो मैं अब अंतर देख सकता हूं, लेकिन मैं खो देता हूं कि अंतर किस फ़ाइल में है, और मुझे अभी भी एक लाइन नंबर नहीं मिला है।

मेरी सलाह, फ़ाइलों में अंतर खोजने के लिए पॉवरशेल का उपयोग न करें। जैसा कि किसी और ने उल्लेख किया है, एफसी काम करता है, और तुलना-वस्तु की तुलना में थोड़ा बेहतर काम करता है, और यहां तक ​​कि बेहतर है कि माइक्स का उल्लेख किए गए यूनिक्स एमुलेटर जैसे वास्तविक टूल को डाउनलोड करना और उपयोग करना।


यह भी एक सेट तुलना करने के लिए प्रतीत होता है (यानी आदेश की अनदेखी) -SyncWindowडिफ़ॉल्ट रूप से अधिकतम है। इसे 0 पर सेट करना diffकिसी भी तरह से काम नहीं करता है ... और जब मैंने (... | select-object ...)इनपुट के रूप में एक पाइप पारित किया , तो यह सिर्फ बकवास मुद्रित किया, इसलिए मैंने छोड़ दिया।
निकोलय

3

जैसा कि दूसरों ने नोट किया है, अगर आप यूनिक्स-वाई डिफरेंशियल आउटपुट की उम्मीद कर रहे थे, तो पॉवरशेल डिफरेंट अलियास के इस्तेमाल से आपको मुश्किल कम होगी। एक बात के लिए, आपको वास्तव में पढ़ने वाली फाइलों में (gc / get-content के साथ) हाथ रखना होगा। दूसरे के लिए, अंतर संकेतक दाईं ओर है, सामग्री से दूर - यह एक पठनीयता दुःस्वप्न है।

किसी के लिए एक संत उत्पादन की तलाश का समाधान है

  1. एक वास्तविक अंतर प्राप्त करें (जैसे GnuWin32 से)
  2. % USERPROFILE% \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 संपादित करें
  3. लाइन जोड़ें

    remove-item alias:diff -force

-Force तर्क की आवश्यकता है क्योंकि पॉवर्सशेल इस विशेष रूप से इनबिल्ट उर्फ ​​के बारे में काफी कीमती है। अगर किसी को भी दिलचस्पी है, तो GnuWin32 स्थापित होने के बाद, मैं अपनी पॉवरशेल प्रोफाइल में निम्नलिखित को भी शामिल कर सकता हूं:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

मुख्य रूप से क्योंकि पॉवरशेल उन तर्कों को नहीं समझते हैं जो एक साथ चलते हैं और टाइपिंग करते हैं, उदाहरण के लिए "rm -Force -Recurse" "rm -rf" की तुलना में बहुत अधिक प्रयास है।

पॉवर्सशेल में कुछ अच्छे फीचर्स हैं, लेकिन कुछ चीजें हैं जो सिर्फ मेरे लिए करने की कोशिश नहीं करनी चाहिए।


2

WinMerge एक और अच्छा GUI- आधारित डिफरेंट टूल है।


1
यह मैंने अतीत में कैसे किया, जो एक मैनुअल प्रक्रिया है, जिसे मैं एक छोटी स्क्रिप्ट के साथ बदलना चाहता था।
ब्राच जूल

1

विंडिफ़ भी है जो एक जीयूआई अंतर इंटरफ़ेस प्रदान करता है (जीयूआई आधारित सीवीएस / एसवीएन कार्यक्रमों के साथ उपयोग के लिए महान)


1

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पैरामीटर) को बदलने की भी आवश्यकता होती है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.