উইন্ডোজ পাওয়ারশেলে আমি কীভাবে দুটি পাঠ্য ফাইলকে পৃথক করতে পারি?


96

আমার কাছে দুটি পাঠ্য ফাইল রয়েছে এবং উইন্ডোজ পাওয়ারশেল ব্যবহার করে তাদের মধ্যে পার্থক্যগুলি সন্ধান করতে চাই। ইউনিক্স ডিফের সরঞ্জামের মতো কিছু পাওয়া যায়? বা অন্য কোন উপায় আছে যা আমি বিবেচনা করি নি?

আমি তুলনা-অবজেক্ট চেষ্টা করেছি, কিন্তু এই ক্রিপ্টিক আউটপুট পান:

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

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

উত্তর:


101

নিজেই বুঝেছি। পাওয়ারশেল পাঠ্যের পরিবর্তে। নেট অবজেক্টের সাথে কাজ করে বলে আপনাকে পাঠ্য ফাইলগুলির বিষয়বস্তু প্রকাশ করতে গেট-সামগ্রী ব্যবহার করতে হবে। প্রশ্নটিতে আমি যা করার চেষ্টা করছিলাম তা সম্পাদন করতে, ব্যবহার করুন:

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

1
আমি যখন দুটি ফাইলের তুলনা করার চেষ্টা করলাম তখন আমি খুব অবাক হয়েছিলাম: সংখ্যার একটি অরসেটেড অ্যারে, এবং সেগুলি সাজানোর পরে একই সংখ্যার অ্যারে। ফাইলগুলি খুব আলাদা হওয়া সত্ত্বেও কোনও আউটপুট নেই। স্পষ্টতই, তুলনা-অবজেক্ট অর্ডার বিবেচনা করে না।
সিজিবিএম

1
@ সিজিবিএম - আপনি এটি -SyncWindow 0ঠিক করতে ব্যবহার করতে পারেন , আমি বিশ্বাস করি, যদিও এটি সম্প্রতি চালু হয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই। যদিও এটি সম্পর্কে বিশেষত স্মার্ট নয়।
জেমস রুসকিন

32

এটি করার একটি সহজ উপায় হ'ল:

diff (cat file1) (cat file2)

15
ডিফ এবং বিড়াল পাওয়ারশেলের তুলনা-অবজেক্ট এবং গেট-কন্টেন্টের জন্য কেবলমাত্র উপকরণ। এটা একই জিনিস।
শন মেল্টন

4
এটি গৃহীত উত্তরের মতো একই সত্ত্বেও, আমি এই বাক্য
গঠনটি

diffএখানে অন্যান্য উত্তর হিসাবে নোট হিসাবে এটি মোটেও * নিক্সের মতো আচরণ করে না তা নোট করুন। এবং যখন আমি এর পরিবর্তে আরও জটিল এক্সপ্রেশন ব্যবহার catকরেছি আমার ভুল আউটপুট পেয়েছে, তাই আপনি যদি * নিক্স থেকে এসে থাকেন তবে পাওয়ারশেলে এটি করা এড়াতে আমি অন্যদের সাথে পরামর্শের সাথে যোগ দেব।
নিকোলো

29

অথবা আপনি ডস fcকমান্ডটি এর মতো ব্যবহার করতে পারেন (এটি উভয় ফাইলের আউটপুট দেখায় যাতে আপনাকে পার্থক্যের জন্য স্ক্যান করতে হবে):

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

fcফর্ম্যাট-কাস্টম সেমিডলেটের জন্য একটি উপনাম তাই কমান্ডটি অবশ্যই প্রবেশ করানো নিশ্চিত হনfc.exe । দয়া করে নোট করুন যে অনেকগুলি ডস ইউটিলিটিগুলি ইউটিএফ -8 এনকোডিং পরিচালনা করে না।

আপনি একটি সিএমডি প্রক্রিয়াও ছড়িয়ে দিতে পারেন এবং এর fcমধ্যে চালাতে পারেন।

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

এই পাওয়ারশেলকে উদ্ধৃতিতে পরামিতিগুলি ব্যবহার করে 'সেন্টিমিডি' প্রোগ্রাম দিয়ে একটি প্রক্রিয়া শুরু করার নির্দেশ দেয়। উদ্ধৃতিগুলিতে, কমান্ডটি চালানো এবং শেষ করতে '/ সি' সেমিডি বিকল্পটি রয়েছে। প্রক্রিয়াটিতে সিএমডি দ্বারা চালিত আসল কমান্ডটি fc filea.txt fileb.txtআউটপুটটিকে ফাইলে ডাইরেক্ট করছে diff.txt

আপনি fc.exeপাওয়ারশেলের মধ্যে থেকে ডস ব্যবহার করতে পারেন ।


2
ডসটি বের করার জন্য +1 ^ _ ^
জেফ ব্রিডম্যান

1
"এফসি" আমার পক্ষে কাজ করে না, এবং আমি বুঝতে পারি নি যে এটির ফর্ম্যাট-কাস্টম থেকে আলাদা করার জন্য আমাকে "fc.exe" হিসাবে নির্দিষ্ট করতে হবে। ঠিক আমি খুঁজছেন ছিল কি. ধন্যবাদ।
জোনাট্রন

হতে পারে আমি একটি সম্পূর্ণ ফিলিস্তিন, তবে এটি আমার পক্ষে আরও বেশি ব্যবহারযোগ্য বলে মনে হয়। এটি আমার সমস্যাটি খুব সুন্দরভাবে সমাধান করেছে।
এজে।

একমাত্র সমস্যা হ'ল এটি ইউনিকোড ঘৃণ্য।
iCodeSometime

7

* নিক্সে পার্থক্য শেলের অংশ নয়, তবে একটি পৃথক অ্যাপ্লিকেশন।

পাওয়ারশেলের অধীনে আপনি কেবল ডিফ.এক্সই ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে কি?

আপনি আনক্সুটিলস প্যাকেজ থেকে একটি সংস্করণ ডাউনলোড করতে পারেন ( http://unxutils.sourceforge.net/ )


10
পাওয়ারশেল এখন অন্তর্ভুক্ত করা হয়েছে, ডাউনলোড এবং ইনস্টল কিছুই।
ব্র্যাচ

আমি সবেমাত্র ব্যবহার শেষ করেছি git diff, কারণ আমি ইতিমধ্যে এটি ইনস্টল করেছি। আমার প্রত্যাশিত আউটপুটও fc.exeনা Compare-Objectউত্পাদন করেছিল।
রাজিয়েল

4

তুলনা-অবজেক্ট (ওরফে ডিফ ফার্স্ট ওরফে) হতাশাজনক যদি আপনি এটি ইউনিক্স ডিফের মতো কিছু আচরণ করার প্রত্যাশা করেন। আমি ডিফ (জিসি ফাইল 1) (জিসি ফাইল 2) চেষ্টা করেছি, এবং যদি কোনও লাইন খুব দীর্ঘ হয় তবে আমি প্রকৃত পার্থক্য দেখতে পাচ্ছি না এবং আরও গুরুত্বপূর্ণভাবে, আমি কোন লাইন নম্বরটি চালু আছে তা বলতে পারি না।

আমি যখন পাসপাথ্রু যুক্ত করার চেষ্টা করব তখন আমি এখন পার্থক্যটি দেখতে পাচ্ছি তবে পার্থক্যটি কোন ফাইলটিতে রয়েছে তা আমি হারিয়ে ফেলেছি এবং আমি এখনও একটি লাইন নম্বর পাই না।

আমার পরামর্শ, ফাইলগুলির মধ্যে পার্থক্য খুঁজতে পাওয়ারশেল ব্যবহার করবেন না। অন্য কারও হিসাবে উল্লেখ করা হয়েছে, এফসি কাজ করে এবং তুলনা-অবজেক্টের থেকে কিছুটা ভাল কাজ করে এবং মাইকেজের উল্লেখ করা ইউনিক্স এমুলেটরের মতো বাস্তব সরঞ্জামগুলি ডাউনলোড এবং ব্যবহার করা আরও ভাল।


এটি একটি সেট তুলনা (যেমন অর্ডার উপেক্ষা করে) -SyncWindowডিফল্টরূপে ম্যাকসিন্ট হিসাবে প্রদর্শিত হয়। 0 এ সেট করা এটি diffউভয়ের মতোই কাজ করে না ... এবং যখন আমি কোনও পাইপ (... | select-object ...)ইনপুট হিসাবে পাস করি , এটি কেবল বাজে মুদ্রণ করে, তাই আমি হাল ছেড়ে দিয়ে যাই।
নিকোলো

3

অন্যরা যেমন উল্লেখ করেছে, আপনি যদি ইউনিক্স-ওয়াইফ আউটপুট আশা করে থাকেন তবে পাওয়ারশেল ডিফ উপনামটি ব্যবহার করা আপনাকে শক্ত করে নিবে। একটি জিনিসের জন্য, আপনাকে আসলে ফাইল পড়ার ক্ষেত্রে (জিসি / গেট-সামগ্রী সহ) এটির হাত ধরে রাখতে হবে। অন্যের জন্য, পার্থক্য সূচকটি ডানদিকে রয়েছে, সামগ্রী থেকে খুব দূরে - এটি একটি পাঠযোগ্যতার দুঃস্বপ্ন।

একটি বুদ্ধিমান আউটপুট খুঁজছেন যে কেউ এর সমাধান হল

  1. একটি সত্য পার্থক্য পান (যেমন GnuWin32 থেকে)
  2. % USERPROFILE% \ ডকুমেন্টস \ উইন্ডোজপাওয়ারশেল \ মাইক্রোসফ্ট সম্পাদনা করুন
  3. লাইন যোগ করুন

    remove-item alias:diff -force

-ফোর্স যুক্তি প্রয়োজন কারণ পাওয়ারশেল এই বিশেষ ইনবিল্ট ওরফে সম্পর্কে যথেষ্ট মূল্যবান। যদি কেউ আগ্রহী হন, GnuWin32 ইনস্টল করে রাখেন, আমি আমার পাওয়ারশেল প্রোফাইলে নিম্নলিখিতগুলিও অন্তর্ভুক্ত করছি:

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

মূলত যেহেতু পাওয়ারশেল একত্রিত হয়ে টাইপ করা যুক্তিগুলি বুঝতে পারে না, উদাহরণস্বরূপ "আরএম-ফরাস-রেকার্স" "আরএম-আরএফ" এর চেয়ে অনেক বেশি প্রচেষ্টা।

পাওয়ারশেলের কয়েকটি দুর্দান্ত বৈশিষ্ট্য রয়েছে তবে কিছু জিনিস রয়েছে যা আমার জন্য করার চেষ্টা করা উচিত নয়।


2

উইনমার্জ হ'ল আরও একটি ভাল জিইউআই ভিত্তিক ডিফ সরঞ্জাম।


1
আমি এটি অতীতে এটি করেছি, যা একটি ম্যানুয়াল প্রক্রিয়া, যা আমি একটি ছোট স্ক্রিপ্ট দিয়ে প্রতিস্থাপন করতে চেয়েছিলাম।
ব্র্যাচ

1

এর রয়েছে Windiff যা একটি GUI পরিবর্তন ইন্টারফেস (GUI ভিত্তিক জীবনবৃত্তান্ত / SVN প্রোগ্রাম সঙ্গে ব্যবহারের জন্য মহান) প্রদান করে


1

fc.exeপাঠ্য তুলনা করার জন্য এটি আরও ভাল, যেহেতু এটি * নিক্স ডিফের মতো কাজ করার জন্য ডিজাইন করা হয়েছে, যেমন লাইনগুলি যথাক্রমে তুলনা করে প্রকৃত পার্থক্য দেখায় এবং পুনরায় সংশ্লেষিত করার চেষ্টা করে (যদি বিবিধ বিভাগগুলির দৈর্ঘ্য থাকে)। এটিতে কিছু কার্যকর নিয়ন্ত্রণ বিকল্প রয়েছে (পাঠ্য / বাইনারি, কেস সংবেদনশীলতা, লাইন সংখ্যা, পুনরায় সংশ্লেষণের দৈর্ঘ্য, মিল নয় বাফার আকার) এবং প্রস্থান স্থিতি সরবরাহ করে (-1 খারাপ সিনট্যাক্স, 0 টি ফাইল একই, 1 ফাইল পৃথক, 2 ফাইল অনুপস্থিত)। একটি (খুব) পুরানো ডস ইউটিলিটি হওয়ায় এর কয়েকটি সীমাবদ্ধতা রয়েছে। সবচেয়ে উল্লেখযোগ্যভাবে, এটি ইউনিকোডের সাথে স্বয়ংক্রিয়ভাবে কাজ করে না, 0 এসএসআইআই অক্ষরের 0 এমএসবি লাইন টার্মিনেটর হিসাবে বিবেচনা করে তাই ফাইলটি 1 টি অক্ষরের লাইনের অনুক্রম হয়ে যায় (@ টেনেসিক: BOTH ফাইলগুলি নির্দিষ্ট করার জন্য / ইউ বিকল্পটি ইউনিকোড, উইনএক্সপি ব্যবহার করুন) ) এবং এটিতে একটি হার্ড লাইন বাফার আকার 128 টি অক্ষর (128 বাইট ASCII,

তুলনা-অবজেক্টটি 2 বস্তু সদস্য-ভিত্তিক অভিন্ন কিনা তা নির্ধারণের জন্য ডিজাইন করা হয়েছে। যদি বস্তুগুলি সংগ্রহ হয় তবে সেগুলিকে SETS হিসাবে বিবেচনা করা হবে (সহায়তা তুলনা-অবজেক্ট দেখুন), যেমন ডুপ্লিকেট ছাড়াই নিবন্ধযুক্ত সংগ্রহ। অর্ডার বা সদৃশ নির্বিশেষে তাদের যদি একই সদস্য আইটেম থাকে তবে 2 সেট সমান। পার্থক্যগুলির জন্য পাঠ্য ফাইলের তুলনা করার জন্য এটি কঠোরভাবে এর কার্যকারিতা সীমাবদ্ধ করে। প্রথমত, পুরো অবজেক্ট (ফাইল = স্ট্রিং এর স্ট্রিং) ততক্ষণ ডিফল্ট আচরণ পার্থক্যগুলি সংগ্রহ করে এবং এইভাবে পার্থক্যগুলির অবস্থান সম্পর্কিত তথ্য হারাতে এবং কোন পার্থক্যটিকে জোড়া দেওয়া হয়েছে তা অস্পষ্ট করে দেওয়া হয় (এবং কোনও এসইটি-র জন্য লাইন নম্বর সম্পর্কে কোনও ধারণা নেই) স্ট্রিং)। -Synchwindow 0 ব্যবহারের ফলে পার্থক্যগুলি দেখা দেওয়ার সাথে সাথেই তা নির্গত হতে পারে তবে পুনরায় সমন্বয় করার চেষ্টা করা বন্ধ করে দেয় যদি একটি ফাইলের অতিরিক্ত লাইন থাকে তবে পরবর্তী লাইন তুলনাগুলি ব্যর্থ হতে পারে যদিও ফাইলগুলি অন্যভাবে অভিন্ন হয় (যতক্ষণ না কোনও ক্ষতিপূরণ না পাওয়া পর্যন্ত) অন্য ফাইলটিতে অতিরিক্ত লাইন যার ফলে ম্যাচের লাইনগুলিকে পুনরায় তৈরি করা হবে)। তবে পাওয়ারশেল চূড়ান্তভাবে বহুমুখী এবং একটি কার্যকরী ফাইলের তুলনা এই কার্যকারিতাটি ব্যবহার করে করা যায়, যদিও যথেষ্ট জটিলতার ব্যয় করে এবং ফাইলগুলির সামগ্রীতে কিছু সীমাবদ্ধতা রয়েছে। আপনার যদি দীর্ঘ (> 127 অক্ষর) লাইনগুলি এবং যেখানে লাইনগুলি বেশিরভাগ 1 টির সাথে মেলে:

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 পৃথক পৃথক ইনপুট অবজেক্টগুলিতে আউটপুট করার কারণে (যার মধ্যে লাইন নম্বর এবং ফাইল সূচক অন্তর্ভুক্ত) পরিবর্তিত তুলনামূলক অবজেক্টগুলির পরিবর্তে (যা না) don't
  • sort-objectতারপরে সমস্ত লাইনগুলি ক্রমানুসারে রাখে।
    আউট স্ট্রিংটি কাটা কাটা এড়ানোর জন্য যথেষ্ট প্রশস্ততা নির্দিষ্ট করে পর্দার প্রস্থে (মার্ক টোয়ারসাপ দ্বারা উল্লিখিত) ফিট করার জন্য আউটপুটটির ডিফল্ট কাটা থামিয়ে দেয়। সাধারণত, এই আউটপুটটি এমন কোনও ফাইলে রাখা হবে যা স্ক্রোলিং সম্পাদক (উদাহরণস্বরূপ নোটপ্যাড) ব্যবহার করে দেখা হবে।

বিঃদ্রঃ

লাইন সংখ্যা বিন্যাস {0,6} একটি সঠিক ন্যায়সঙ্গত, স্পেস প্যাডেড 6 অক্ষর লাইন নম্বর দেয় (বাছাই করার জন্য)। যদি ফাইলগুলির মধ্যে 999,999 টিরও বেশি লাইন থাকে তবে কেবল বিন্যাসটিকে আরও প্রশস্ত করতে পরিবর্তন করুন। এটির জন্য $_.substringপ্যারামিটার (লাইন সংখ্যা প্রস্থের চেয়ে 3 টি বেশি) এবং আউট-স্ট্রিং xx মান (সর্বাধিক লাইনের দৈর্ঘ্য + $_.substringপরামিতি) পরিবর্তন করা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.