כאשר אתה עובד עם ערכי מאפיין 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, כמו בדוגמה למטה.
לאחר שיש לך את 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 עם סוג ההפעלה אוטומטי:
שים לב שבמקום שימוש ב- 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 -ServiceName 'BITS'
.
אולי תרצה להתקדם ולמצוא את כל השירותים עם מצב שאינו Running וגם סוג ההתחלה שהוא ב מחרוזת יחידה (או יכולה להיות מערך) בשם Manual. באמצעות סקריפטבלוק למטה, הפקודה משתמשת בפרמטר FilterScript
להעביר סקריפטבלוק שמעריך את שתי התנאים הללו.
קשור: חזרה ליסודות: הבנה על עצמם של אובייקטים ב־PowerShell
כאשר אתה מריץ את הפקודה לעיל, תראה רק שירותים שנעצרו ויש להם StartType של Manual.

סינון עם אופרטורי הכללה עובד היטב עם אוספים שמכילים הרבה ערכי מאפיין. בשל המספר המרבי של מאפיינים שמחזירה הפקודה 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.

match
operator uses regular expressions to match on certain values.קשור: התחלה עם PowerShell ו־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
בפוורשל.
באמצעות בלוק תסריט, תוכל לשלב שתי תנאים יחד באמצעות האופרטור and
המקדם אותם שניהם. אם שניהם מחזירים אמת, Where-Object
מחזיר את אובייקט התהליך שעבר בצינור. אם לפחות אחד מהתנאים מחזיר שקר, Where-Object
משליך את האובייקט.
הנה מה שתצפה לראות:

סינון באמצעות האופרטורים שוויון של Where-Object
יעזור לך בבניית דוחות מערכת או בהשוואת ערכים.
שלבים הבאים
עכשיו שאתה יודע יותר על איך להשתמש ב-Where-Object
cmdlet של PowerShell כדי לסנן את כל הדברים, מה עוד אתה יכול לעשות? תנסה כמה משימות סינון מורכבות יותר באמצעות תנאים מרובים ואופרטורים על אוספים כדי לסנן ערכי מאפיינים ולעצב את הפלט לפי טעמך.
Source:
https://adamtheautomator.com/powershell-where-object/