عندما تعمل مع قيم الخاصية في 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 مثلما هو موضح أدناه.
بمجرد الحصول على scriptblock للتصفية، بعد ذلك ستقدم ذلك الscriptblock إلى معلمة FilterScript
. سيقوم Where-Object
بتنفيذ هذا الscriptblock لكل كائن يأتي عبر خط الأنابيب وتقييم كل خاصية StartType
. إذا كانت الخاصية تساوي Automatic، سيمرر Where-Object
الكائن. إذا لم يكن الأمر كذلك، سيتم حذف الكائن.
يمكنك رؤية مثال بسيط على هذه الطريقة أدناه.

يستخدم العديد من الأشخاص المعلمات الوضعية مع cmdlet
Where-Object
ولا يتضمنون اسم معلمةFilterScript
. بدلاً من ذلك، يقدمون الscriptblock بمفردهم مثلWhere-Object {$_.StartType -eq 'Automatic'}
.
في حين أن هذا النوع من البناء يعمل لهذا السيناريو بشكل خاص، إلا أن مفهوم scriptblock مع الأقواس المنحنية أو حتى المتغير في خط الأنابيب $_
يجعل الكود أقل قراءة وأكثر صعوبة بالنسبة لمستخدمي PowerShell ذوي الخبرة القليلة. هذه المشكلة في القراءة هي ما دفع فريق PowerShell لتقديم المعلمات أو عبارات المقارنة.
عبارات المقارنة
تمت إدخال التصريحات المقارنة في Windows PowerShell 3.0 بشكل يتسم بمزيد من التدفق الطبيعي في كيفية بنائها. باستخدام نفس السيناريو كمثال سابق، دعونا نستخدم تصريح البناء المقارن للعثور على جميع خدمات Windows ذات نوع بدء تلقائي:
لاحظ أعلاه أنه بدلاً من استخدام كتلة نصية، يُحدد الأمر خاصية الكائن كقيمة لمعلمة 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 -ServiceName 'BITS'
.
ربما ترغب في الحصول على معلومات أكثر تعقيدًا والعثور على جميع الخدمات التي لها حالة ليست تعمل و نوع البدء الذي هو في سلسلة واحدة (أو يمكن أن تكون مصفوفة) تسمى يدوي. باستخدام كتلة النص أدناه، يستخدم الأمر المعلمة FilterScript
لتمرير كتلة نص تقيم كلتا الشروط.
ذات صلة: العودة إلى الأساسيات: فهم كائنات PowerShell
عند تشغيل الأمر أعلاه، سترى فقط الخدمات التي تم إيقافها ولديها StartType من Manual.

تعمل عمليات التصفية باستخدام العوامل التضمين بشكل جيد مع المجموعات التي تحتوي على العديد من قيم الخصائص. نظرًا لعدد الخصائص التي يُرجعها 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.

match
operator uses regular expressions to match on certain values.مرتبط: البدء مع باور شيل و Regex
يمكنك أيضاً استخدام مشغل like
لاستخدام تقنيات المطابقة الشائعة مثل استخدام البادئة (*
) لمطابقة أي حرف أو ربما ؟
لمطابقة حرف واحد.
تم تصفية النتائج الآن لتشمل فقط أسماء الخدمة التي تحتوي على ‘ 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
تسقط الكائن.
هنا ما يمكنك توقع رؤيته:

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