التحكم في PowerShell Where-Object: دليل شامل

عندما تعمل مع قيم الخاصية في PowerShell في مجموعة من الكائنات ، فإنه في بعض الأحيان ستحتاج إلى طريقة لتصفية كل الأشياء التي لا تحتاج إليها. معرفة كيفية استخدام cmdlet Where-Object في PowerShell هو مهارة مهمة يجب أن تكون متوفرة في مجموعة أدوات PowerShell الخاصة بك.

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

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

هناك متطلب واحد فقط لهذه المقالة. يجب أن تكون لديك بعض المعرفة الأساسية بأوامر PowerShell والصيغة.

سيستند جميع الأمثلة في هذه المقالة إلى إصدار PowerShell الثابت الحالي (7.1.0 في وقت الكتابة). ولكن طالما أن لديك Windows PowerShell 4.0 وأعلى ، ستعمل الأوامر بنفس الطريقة.

فهم كيفية عمل PowerShell Where-Object

هدف cmdlet Where-Object في PowerShell هو فقط تصفية الإخراج الذي يعود به الأمر لإعادة المعلومات التي تريد رؤيتها فقط.

باختصار ، cmdlet Where-Object هو عامل تصفية ، هذا كل شيء. يتيح لك بناء شرط يعيد القيمة الصحيحة أو الخاطئة. اعتمادًا على نتيجة هذا الشرط ، يعيد الcmdlet الإخراج أو لا يعيده.

يمكنك صياغة هذا الشرط بإحدى الطريقتين؛ الطريقة “القديمة” باستخدام scriptblocks والطريقة “الجديدة” باستخدام المعلمات أو البيانات المقارنة.

إنشاء شروط تصفية باستخدام السكربتات

السكربتات هي مكون رئيسي في PowerShell. تُستخدم السكربتات في مئات الأماكن في جميع أنحاء اللغة. السكربت هو وظيفة مجهولة. إنها طريقة لتقسيم الشيفرة وتنفيذها في أماكن مختلفة. يمكنك بناء عامل تصفية ل Where-Object عبر سكربت.

لاستخدام السكربت كعامل تصفية، يجب عليك استخدام المعلمة FilterScript. تتيح لك هذه المعلمة إنشاء وتمرير سكربت إلى المعلمة FilterScript ثم يتم تنفيذه.

إذا كانت السكربتات ترجع قيمة مختلفة عن الخطأ المنطقي أو متغير فارغ، يُعتبر ذلك صحيحًا. إذا لم يكن كذلك، يُعتبر خطأً.

على سبيل المثال، دعنا نقول إنك بحاجة إلى العثور على جميع خدمات Windows التي تمتلك حاليًا نوع بدء تشغيل تلقائي. يجب أن تجمع أولاً جميع الخدمات الحالية باستخدام Get-Service . ثم، Get-Service تعيد العديد من كائنات الخدمة المختلفة بخصائص متنوعة.

باستخدام خط الأوامر PowerShell، يمكنك بعد ذلك توجيه تلك الكائنات إلى cmdlet Where-Object واستخدام معلمة FilterScript. نظرًا لأن معلمة FilterScript تقبل scriptblock، يمكنك إنشاء شرط للتحقق مما إذا كانت خاصية StartType لكل كائن مساوية لـ Automatic مثلما هو موضح أدناه.

{$_.StartType -EQ 'Automatic'}

بمجرد الحصول على scriptblock للتصفية، بعد ذلك ستقدم ذلك الscriptblock إلى معلمة FilterScript. سيقوم Where-Object بتنفيذ هذا الscriptblock لكل كائن يأتي عبر خط الأنابيب وتقييم كل خاصية StartType. إذا كانت الخاصية تساوي Automatic، سيمرر Where-Object الكائن. إذا لم يكن الأمر كذلك، سيتم حذف الكائن.

يمكنك رؤية مثال بسيط على هذه الطريقة أدناه.

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}
Script Block construct

يستخدم العديد من الأشخاص المعلمات الوضعية مع cmdlet Where-Object ولا يتضمنون اسم معلمة FilterScript. بدلاً من ذلك، يقدمون الscriptblock بمفردهم مثل Where-Object {$_.StartType -eq 'Automatic'}.

في حين أن هذا النوع من البناء يعمل لهذا السيناريو بشكل خاص، إلا أن مفهوم scriptblock مع الأقواس المنحنية أو حتى المتغير في خط الأنابيب $_ يجعل الكود أقل قراءة وأكثر صعوبة بالنسبة لمستخدمي PowerShell ذوي الخبرة القليلة. هذه المشكلة في القراءة هي ما دفع فريق PowerShell لتقديم المعلمات أو عبارات المقارنة.

عبارات المقارنة

تمت إدخال التصريحات المقارنة في Windows PowerShell 3.0 بشكل يتسم بمزيد من التدفق الطبيعي في كيفية بنائها. باستخدام نفس السيناريو كمثال سابق، دعونا نستخدم تصريح البناء المقارن للعثور على جميع خدمات Windows ذات نوع بدء تلقائي:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

لاحظ أعلاه أنه بدلاً من استخدام كتلة نصية، يُحدد الأمر خاصية الكائن كقيمة لمعلمة Property. العامل eq الآن هو معلمة أيضًا، مما يتيح لك تمرير قيمة تلقائي إليه.

باستخدام المعلمات بهذا الشكل، يتم الآن القضاء على الحاجة إلى كتلة نصية بشكل كامل.

A scriptblock is a better choice when defining more complex filtering conditions. The Property parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!

في القسم التالي، ستتعرف على أنواع مشغلات المقارنة المتاحة التي يمكن استخدامها مع Where-Object لتصفية جميع الأشياء.

أساسيات التصفية

باستخدام المعلمات، يقوم Where-Object بتصفية مجموعات الكائنات باستخدام مشغلات المقارنة الشائعة. دعونا نستعرض بعض الأمثلة على كيفية عملها.

مشغلات الاحتواء

تعتبر مشغلات الاحتواء مفيدة عند العمل مع مجموعات. تتيح لك مشغلات الاحتواء تحديد شرط إذا كانت المجموعة تحتوي على عنصر أم لا.

على سبيل المثال، لنقل أنك ترغب في تصفية قيمة خاصة في خاصية مجموعة. يمكنك استخدام مشغلات الاحتواء.

في PowerShell، ستجد بعض مشغلات الاحتواء المختلفة:

  • -contains / -ccontains – تصفية مجموعة تحتوي على قيمة خاصية.
  • -notcontains / -cnotcontains – يقوم بتصفية مجموعة لا تحتوي على قيمة خاصية.
  • -in / -cin – القيمة موجودة في مجموعة، ويعيد قيمة الخاصية إذا تم العثور على تطابق.
  • -notin / -cnotin – القيمة غير موجودة في مجموعة، null/$false إذا لم تكن هناك قيمة خاصية.

بالنسبة لحساسية الحالة، استخدم مشغلات الاحتواء التي تبدأ بـ-c[مشغل]

ذات صلة: فهم عوامل التشابه في PowerShell بالأمثلة

لنفترض أنك ترغب في التحقق من حالة خدمة Windows BITS. يمكنك القيام بذلك باستخدام معلمة contains (المشغل) عن طريق تمرير قيمة BITS إليها كما في الأسفل.

Get-Service | Where-Object -Property Name -Contains 'BITS'

وأدناه ما يمكنك توقعه:

Where-Object equivalent to Get-Service -ServiceName ‘BITS’

تذكر دائمًا تصفية اليسار! المثال السابق يعادل تشغيل Get-Service -ServiceName 'BITS' .

ربما ترغب في الحصول على معلومات أكثر تعقيدًا والعثور على جميع الخدمات التي لها حالة ليست تعمل و نوع البدء الذي هو في سلسلة واحدة (أو يمكن أن تكون مصفوفة) تسمى يدوي. باستخدام كتلة النص أدناه، يستخدم الأمر المعلمة FilterScript لتمرير كتلة نص تقيم كلتا الشروط.

ذات صلة: العودة إلى الأساسيات: فهم كائنات PowerShell

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

عند تشغيل الأمر أعلاه، سترى فقط الخدمات التي تم إيقافها ولديها StartType من Manual.

More advanced filtering of a collection of objects

تعمل عمليات التصفية باستخدام العوامل التضمين بشكل جيد مع المجموعات التي تحتوي على العديد من قيم الخصائص. نظرًا لعدد الخصائص التي يُرجعها Get-Service، يصبح من الأسهل تصفية هذه الخصائص جميعها عندما تجمع بين العوامل التضمين و العوامل المنطقية.

عوامل الطابق

على غرار كيفية استخدامك لعوامل الطابق مع Where-Object، يمكنك أيضًا استخدام عوامل الطابق. تسمح لك عوامل الطابق بمطابقة السلاسل داخل السلاسل. على سبيل المثال، 'foofoo' -like '*foo*' يعيد True أو 'foofoo' -match 'foo' يعيد True. تطابق عوامل الطابق السلاسل في السلاسل.

في PowerShell، لديك عدة عوامل طابقة مختلفة يمكنك استخدامها داخل Where-Object.

  • -like / -clike – تطابق السلسلة نمط البطاقة الجامحة.
  • -notlike / -cnotlike – السلسلة لا تتطابق مع نمط البطاقة الجامحة.
  • -match / -cmatch – السلسلة تطابق نمط regex.
  • -notmatch / -cnotmatch – السلسلة لا تتطابق مع نمط regex.

بالنسبة لحالة الحساسية، استخدم عوامل الطابق التي تبدأ بـ -c[operator]

تقريباً متطابقة في الشكل مع مشغلات الحصر، يمكنك استخدام مشغلات المطابقة كما هو موضح أدناه. المثال أدناه يجد جميع الخدمات التي تحتوي على Windows في قيمة الخاصية DisplayName.

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}
The match operator uses regular expressions to match on certain values.

مرتبط: البدء مع باور شيل و Regex

يمكنك أيضاً استخدام مشغل like لاستخدام تقنيات المطابقة الشائعة مثل استخدام البادئة (*) لمطابقة أي حرف أو ربما ؟ لمطابقة حرف واحد.

Get-Service | Where-Object {($_.Name -like 'Win*')}

تم تصفية النتائج الآن لتشمل فقط أسماء الخدمة التي تحتوي على ‘ Win‘ كأول ثلاثة أحرف:

service names with ‘Win

استخدام البادئة يعني أنه لا داعي لمعرفة الاسم الكامل للخدمة. بضعة أحرف من السلسلة هي كل ما يلزم. يمكن أيضاً دمج هذه المشغلات مع المشغلات المنطقية لتعزيز التصفية بشكل أكبر.

مشغلات المساواة

مماثلة لكيفية استخدام مشغلات الحصر والمقارنة، يمكنك أيضاً استخدام مشغلات المساواة مع Where-Object. مشغلات المساواة مفيدة عند الحاجة إلى مقارنة القيم الرقمية.

على سبيل المثال، 1 -eq 1 ستكون صحيحة بينما 1 -gt 2 ستكون خاطئة. لدي باور شيل العديد من مشغلات المساواة المختلفة التي يمكنك استخدامها كمعلمات ل Where-Object أو داخل كتل نصوص الشروط.

  • -eq / -ceq – القيمة مساوية للقيمة المحددة.
  • -ne / -cne – القيمة ليست مساوية للقيمة المحددة.
  • -gt / -cgt – القيمة أكبر من القيمة المحددة.
  • -ge / -cge – القيمة أكبر من أو تساوي القيمة المحددة.
  • -lt / -clt – القيمة أقل من القيمة المحددة.
  • -le / -cle – القيمة أقل من أو تساوي القيمة المحددة.

على سبيل المثال، ربما ترغب في العثور على جميع العمليات التي تعمل والتي تستهلك بين اثنين وعشرة في المئة من وحدة المعالجة المركزية الخاصة بك. ليس هناك مشكلة باستخدام Get-Process و Where-Object cmdlets في PowerShell.

من خلال استخدام سكربت بلوك، يمكنك دمج شرطين معًا باستخدام عامل and الذي سيقوم بتقييم كلاهما. إذا كان كلاهما يعيد True، فإن Where-Object ستعيد كائن العملية الذي تم تمريره عبر الأنبوب. إذا كان أحد الشروط يعيد False على الأقل، Where-Object تسقط الكائن.

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

هنا ما يمكنك توقع رؤيته:

Filtering with greater than and less than

التصفية باستخدام عوامل المساواة في Where-Object ستساعدك في بناء تقارير النظام أو في مقارنة القيم.

الخطوات التالية

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

Source:
https://adamtheautomator.com/powershell-where-object/