שליטה בפוורשל Where-Object: מדריך מקיף

כאשר אתה עובד עם ערכי מאפיין PowerShell באוסף של אובייקטים, לפעמים תצטרך דרך לסנן את כל הדברים שאינך זקוק להם. לדעת כיצד להשתמש בפקודת Where-Object של PowerShell היא מיומנות חשובה לכלי ה- PowerShell שלך.

פקודת ה- Where-Object היא דרך שימושית לסנן אובייקטים. במדריך זה, תלמד שונות איך לבנות פקודת Where-Object, הפרמטרים הזמינים שלה, תחביר, וכיצד להשתמש בתנאים מרובים כמו מומחה!

דרישות מראש

יש רק דרישה אחת למאמר זה. עליך להיות מודע בצורה בסיסית לפקודות ולתחביר של PowerShell.

כל הדוגמאות במאמר זה יתבססו על הגרסה היציבה הנוכחית של PowerShell (7.1.0 בזמן כתיבת המאמר). אך כל עוד יש לך PowerShell עבור Windows גרסה 4.0 ומעלה, הפקודות יעבדו באותו אופן.

הבנת כיצד פקודת ה-Where-Object של PowerShell עובדת

המטרה היחידה של פקודת ה- Where-Object של PowerShell היא לסנן את הפלט של פקודה כדי להחזיר רק את המידע שאתה רוצה לראות.

כלול, פקודת ה- Where-Object היא מסנן; זהו. היא מאפשרת לך לבנות תנאי שמחזיר True או False. בהתאם לתוצאה של התנאי הזה, הפקודה אז או מחזירה את הפלט או לא.

אתה יכול ליצור את התנאי הזה באחד משני הדרכים: הדרך "ישנה" עם קטעי קוד והדרך "חדשה" באמצעות פרמטרים או הצהרות השוואה.

יצירת תנאי מסנן עם קטעי קוד

קטעי הקוד הם רכיב מרכזי בפווהרשל. קטעי הקוד משמשים במאות מקומות בשפה. קטע קוד הוא פונקציה אנונימית. זהו אמצעי לתחום את הקוד ולהפעיל אותו במקומות שונים. באפשרותך לבנות מסנן עבור Where-Object באמצעות קטע קוד.

כדי להשתמש בקטע קוד כמסנן, עליך להשתמש בפרמטר FilterScript. פרמטר זה מאפשר לך ליצור ולהעביר קטע קוד לפרמטר FilterScript שיבוצע אז.

אם קטע הקוד מחזיר ערך שונה מ-FALSE בוליאני או משתנה NULL, הוא נחשב כ-TRUE. אם לא, הוא נחשב כ- FALSE.

לדוגמה, נניח שאתה צריך למצוא את כל שירותי הווינדוס שיש להם כרגע סוג הפעלה של אוטומטי. תחילה תאסוף את כל השירותים הנוכחיים עם Get-Service. Get-Service תחזיר אז אובייקטים של שירותים שונים עם מאפיינים שונים.

שימוש בצינור PowerShell, באפשרותך להעביר את אותם אובייקטים ל cmdlet של Where-Object ולהשתמש בפרמטר של FilterScript. מאחר שפרמטר זה מקבל scriptblock, באפשרותך ליצור תנאי לבדיקה האם התכונה של StartType של כל אובייקט שווה ל-Automatic, כמו בדוגמה למטה.

{$_.StartType -EQ 'Automatic'}

לאחר שיש לך את 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'

שים לב שבמקום שימוש ב- scriptblock, הפקודה מציינת את תכונת האובייקט כערך של פרמטר לפרמטר Property. האופרטור eq הוא כעת גם פרמטר שמאפשר לך להעביר אליו את ערך אוטומטי.

שימוש בפרמטרים בדרך זו מסיר כעת את הצורך ב-scriptblock לחלוטין.

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[operator]

קשור: הבנה על אופרטורי השוואה של PowerShell באמצעות דוגמאות

נניח שברצונך לבדוק את מצב השירות BITS בווינדוס. ניתן לעשות זאת באמצעות הפרמטר contains (אופרטור) ולהעביר את ערך BITS אליו כמו בדוגמה למטה.

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

והנה מה שאתה יכול לצפות לראות:

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

תזכור תמיד לסנן משמאל! הדוגמה הקודמת היא שקולה להרצת Get-Service -ServiceName 'BITS'.

אולי תרצה להתקדם ולמצוא את כל השירותים עם מצב שאינו Running וגם סוג ההתחלה שהוא ב מחרוזת יחידה (או יכולה להיות מערך) בשם Manual. באמצעות סקריפטבלוק למטה, הפקודה משתמשת בפרמטר 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*' מחזיר ערך אמת או 'foofoo' -match 'foo' מחזיר ערך אמת. אופרטורי ההתאמה מתאימים מחרוזות בתוך מחרוזות.

בפוורשל, יש לך מספר אופרטורים התאמה שונים שאתה יכול להשתמש בהם בתוך Where-Object.

  • -like / -clike – מחרוזת מתאימה לתבנית wildcard.
  • -notlike / -cnotlike – מחרוזת לא מתאימה לתבנית wildcard.
  • -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.

קשור: התחלה עם PowerShell ו־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 בפוורשל.

באמצעות בלוק תסריט, תוכל לשלב שתי תנאים יחד באמצעות האופרטור and המקדם אותם שניהם. אם שניהם מחזירים אמת, Where-Object מחזיר את אובייקט התהליך שעבר בצינור. אם לפחות אחד מהתנאים מחזיר שקר, Where-Object משליך את האובייקט.

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

הנה מה שתצפה לראות:

Filtering with greater than and less than

סינון באמצעות האופרטורים שוויון של Where-Object יעזור לך בבניית דוחות מערכת או בהשוואת ערכים.

שלבים הבאים

עכשיו שאתה יודע יותר על איך להשתמש ב-Where-Object cmdlet של PowerShell כדי לסנן את כל הדברים, מה עוד אתה יכול לעשות? תנסה כמה משימות סינון מורכבות יותר באמצעות תנאים מרובים ואופרטורים על אוספים כדי לסנן ערכי מאפיינים ולעצב את הפלט לפי טעמך.

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