قارن الكائنات باستخدام PowerShell (دليل تدريجي)

بالتأكيد، مقارنة الملفات أو محتويات الملفات في نظام التشغيل ويندوز هي إحدى الأشياء التي قمت بها على مر السنين. ولكن هل لاحظت أن مقارنة الملفات والمحتويات تجعل عينيك تتعب في بعض الأحيان؟ حسنًا، لديك الحظ السعيد، يمكنك مقارنة الكائنات باستخدام PowerShell بالطريقة التي تريدها باستخدام الأمر Compare-Object.

في هذا البرنامج التعليمي، ستتعلم كيفية مقارنة الكائنات باستخدام PowerShell، مثل الملفات أو محتويات الملفات، مع تخصيص النتائج.

توفر عينيك التوتر وقارن الكائنات بكفاءة!

المتطلبات المسبقة

سيكون هذا البرنامج التعليمي عمليًا، ولكن بمجرد أن يكون لديك حاسوب يعمل بنظام التشغيل ويندوز مع برنامج PowerShell، فأنت جاهز للبدء. يتم استخدام إصدار PowerShell 5.1 في هذا البرنامج التعليمي.

مقارنة محتويات الملفات

تخيل أن لديك ملفين مختلفين بنفس المحتوى. كيف ستعرف إذا ما إذا كان كل من الملفين يحتوي على نفس المحتوى؟ يمكن أن يكون حل ذلك باستخدام أمر Get-Content. يستخدم أمر Get-Content لاسترداد محتوى ملف من موقع محدد.

افتح PowerShell، وقم بتشغيل الأوامر التالية للحصول على محتوى الملفات المحددة (Get-Content) إلى متغيرات ($file1 و $file2). استبدل المسار أدناه بمسار الملفات التي ترغب في مقارنتها.

# احصل على محتوى ملفات النص إلى متغيرات
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

الآن، قم بتشغيل الأمر Compare-Object أدناه لمقارنة محتويات $file1 (-ReferenceObject) مع $file2 (-DifferenceObject).

بشكل افتراضي، لا يظهر Compare-Object القيم الموجودة في كلتا المتغيرات. كحل، أضف المعامل -IncludeEqual لعرض القيم في النتيجة.

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -IncludeEqual

من النتيجة أدناه، يخبرنا SideIndicator ما إذا كانت كلتا الملفات لديها نفس المحتوى (لكل سطر) أم لا:

SideIndicator Definition
== Indicates the content is present in both files ($file1 and $file2).
=> Indicates the content only exists in the -DifferenceObject file ($file2).
=> Indicates the content only exists in the -ReferenceObject file ($file1).
Comparing File Contents

ربما تفضل مقارنة السلاسل بحساسية الحالة. إذا كنت كذلك، فأضف المعامل -CaseSensitive لأن الأمر Compare-Object غير حساس للحالة افتراضيًا.

قم بتشغيل الأوامر أدناه لمقارنة $file1 مع $file2، كلاهما مع وبدون حساسية الحالة.

# مقارنة محتويات الملفات مع معامل -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# مقارنة محتويات الملفات بدون معامل -CaseSensitive
Compare-Object $file1 $file2

كما يمكنك رؤية أدناه، بدون استخدام معامل -CaseSensitive، لا يظهر أمر Compare-Object powershell في الناتج.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

يعمل مقارنة السلاسل أيضًا بشكل مماثل لمقارنة محتويات الملف، حيث يمكنك تحديد السلاسل أو استخدام متغيرات لتمثيل السلاسل المراد مقارنتها. تذكر أن أمر Compare-Object يقارن بين سلاسل المصدر وليس الأحرف.

مقارنة قوائم الملفات من مواقع مختلفة

الآن بعد أن تعرف كيفية مقارنة محتويات الملف، لماذا لا تقارن الملفات الفعلية من مواقع مختلفة؟ يأتي في المساعدة مقارنة قوائم الملفات عند إدارة خادمين مختلفين حيث يتم الاحتفاظ بنفس المجلد لخدمة تحتوي على نفس الملفات.

في هذا الوقت، ستستخدم أمر Get-ChildItem للحصول على قائمة الملفات في مجلد للمقارنة مع قائمة مجلد آخر من الملفات.

قم بتشغيل الأوامر أدناه للحصول على قوائم الملفات من المجلدين C:\Temp\Folder1\ و C:\Temp\Folder2 وقم بتخزين القوائم في المتغيرات $Folder1List و $Folder2List.

# التقاط قائمة أسماء الملفات في متغيرات
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# مقارنة القوائم
Compare-Object $Folder1List $Folder2List -IncludeEqual

يمكنك أيضًا استخدام معامل -Recurse في أمر Get-ChildItem لاسترجاع قائمة ملفات بشكل تكراري في المجلدات الفرعية.

Comparing Files in Different Folders

Translated Text:

مقارنة الكائنات باستخدام PowerShell حسب الخصائص

لقد قمت للتو بمقارنة الملفات في مواقع مختلفة، ولكن قد ترغب في إضافة خيار آخر لمقارنة الملفات حسب الخصائص. وفي هذا العرض التوضيحي، ستقوم بمقارنة الملفات حسب وقت آخر وصول.

قم بتشغيل الأوامر التالية لمقارنة الملفات من مجلدات مختلفة ($Folder1 و $Folder2) حسب وقت آخر وصول.

# استرجاع قائمة الملفات من الملفات المحددة
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# مقارنة الملفات حسب آخر وقت وصول مع أسماء الملفات
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

مقارنة العمليات والخدمات

قدرات أمر Compare-Object ليست مقتصرة فقط على مقارنة السلاسل أو المحتوى في الملفات. يمكنك أيضًا مقارنة العمليات والخدمات، وهكذا.

ربما ترغب في التقاط الخدمات بين خادمين. في هذه الحالة، يمكنك تخزين الخدمات في متغيرات ومقارنتها.

قم بتشغيل الأوامر التالية لمقارنة الخدمات بين خادمين مختلفين ($server1 و $server2).

# التقاط قائمة الخدمات في متغيرات
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# مقارنة الخدمات على كلتا الخوادم وفرزها حسب اسم الخدمة
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

إذا كنت تفضل مقارنة العمليات، فإن الأوامر المطلوبة للتنفيذ مشابهة لمقارنة الخدمات. يمكنك أيضًا مقارنة العمليات على نفس الجهاز أو خادمين مختلفين.

قم بتشغيل الأوامر أدناه لالتقاط العمليات الجارية من جهازين (Jumpbox و AD servers) في متغيرات ومقارنتها.

# الحصول على قائمة العمليات من الخوادم عن بعد إلى متغيرات PowerShell
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# مقارنة العمليات من خادمين وعرض أسماء العمليات واسم الخادم المقابل في الإخراج
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

تحديد الأنشطة عن طريق مقارنة قوائم العمليات

يعتبر الأمر المحدد Compare-Object مفيدًا أيضًا في بعض حالات استكشاف الأخطاء وإصلاحها. كيف؟ يمكنك التقاط العمليات الجارية حاليًا في متغير وبدء نشاطك. بعد ذلك، يمكنك التقاط العمليات الجارية في متغير جديد ومقارنة العمليات الجديدة.

قم بتشغيل الأوامر أدناه لتحديد الأنشطة عن طريق مقارنة قائمتين مختلفتين من العمليات الملتقطة.

# التقاط العمليات قبل بدء النشاط الخاص بك.
$Initial_Process = Get-Process
# فتح المفكرة (نشاطك)
notepad
# التقاط العمليات بعد اكتمال نشاطك.
$New_Process = Get-Process
# مقارنة العملية الأولية والجديدة
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

مقارنة المستخدمين بين مجموعات Active Directory المختلفة

إذا كنت تدير نفس مجموعة المستخدمين من مجموعات AD مختلفة، فإن مقارنة قائمة المستخدمين باستخدام أمر Compare-Object ستكون مفيدة. من خلال ذلك، يمكنك الحفاظ على مراقبة وثيقة إذا كان مستخدم مفقودًا من أيٍ من مجموعتين مختلفتين من AD.

قم بتشغيل الأوامر أدناه لمقارنة المستخدمين بين مجموعتين مختلفتين من AD (staticvmusers و vdivmusers).

# استيراد وحدة Active Directory لتشغيل أوامر Get-ADGroup و Get-ADUser.
Import-Module ActiveDirectory
# تخزين قائمة المستخدمين من مجموعات AD المختلفة في متغيرات.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# تشغيل أمر compare-object لمقارنة المستخدمين في تلك المجموعاتين AD.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

الاستنتاج

في هذا البرنامج التعليمي، لقد تعلمت قليلًا عن كيفية مقارنة الكائنات باستخدام PowerShell بعدة طرق، من محتويات الملفات إلى المستخدمين في مجموعات AD. لقد أدركت أن cmdlet Compare-Object هو حلاً سريعًا لمقارنة الملفات والخدمات والعمليات، وما إلى ذلك.

لقد اكتسبت المعرفة الأساسية في استخدام cmdlet Compare-Object. الآن، لماذا لا تبني على هذه المعرفة الجديدة التي اكتسبتها من خلال تعلم مقارنة مصفوفات PowerShell القوية؟

Source:
https://adamtheautomator.com/compare-objects-with-powershell/