PowerShell הוא שפת תסרוקת עוצמתית. אך מה הופך את שפת התסרוקת הזו לכל כך עוצמתית? אובייקטים של PowerShell. מהם מורכבים האובייקטים הקסומים הללו ואיך PowerShell עובדת עימם? נשמע מעניין, נמשיך ונראה.
PowerShell היא שפת אובייקטים ותסרוקת. זהו סוף דרך מהתסרוקות המסורתיות כמו cmd ו-Bash. התסרוקות מסורתיות אלו מתמקדות בטקסט, כלומר מחרוזות, ולמרות שהן עדיין שימושיות, הן מוגבלות ביכולותיהן. כמעט כל דבר ב-PowerShell הוא אובייקט.
במאמר זה, תלמד מספר מושגים מרכזיים בנוגע לאובייקטים ב-PowerShell. עד סיום המאמר, תלמד כיצד ליישם את הידע הזה בכתיבת תסרוקות שלך דרך קודי דוגמה ותראה ויזואליזציות מועילות.
אם אתה מעדיף ללמוד דרך חזון ויזואלי, נשמח אם תצפה בסרטון המשלב של המאמר למטה.
אז התפקד! אתה הולך לחוות חוויית למידה שתעזור לך לשלט במושג של האובייקטים ב-PowerShell!
דרישות קדם
במאמר הזה, אתה הולך ללמוד על אובייקטים ב-PowerShell דרך גישה של ידי עשייה. אם תבחר לקבל חלק ולנסות את דוגמאות הקוד, PowerShell 5.1 או כל גרסה אחרת של PowerShell 6+ יעבדו. עם זאת, כל הדוגמאות שתראה יבוצעו על Windows 10 בנייה 1903 עם PowerShell 5.1.
הבנת מבנה של אובייקט
עצמים נמצאים בכל מקום ב-PowerShell. ייתכן ואתה שואל את עצמך "איך נראה עצם?" במקטע הראשון הזה, תקבל מבט על מה עצם מורכב. לאחר שתקבל מבט כללי על מה מהו עצם, תוכל לצפות בדוגמאות קוד!
גילוי חברים של עצם עם Get-Member
לעצמים יש הרבה סוגים שונים של מידע הקשור איתם. ב-PowerShell, מידע זה לפעמים נקרא חברים. חבר של עצם הוא מונח גנרי המתייחס לכל המידע הקשור עם עצם.
כדי לגלות מידע אודות עצם (חברים), תוכל להשתמש בפקודה Get-Member
. פקודת Get-Member
היא פקודה מועילה המאפשרת לך למצוא פרופרטיז, שיטות וכו' זמינים לכל עצם ב-PowerShell.
לדוגמה, נניח שתרצה להציג חברים עבור עצם מסוים המוחזר על ידי הפקודה Get-Service
. תוכל לעשות זאת על ידי הפנייה של פלט הפקודה Get-Service
לפקודת Get-Member
כמו שניתן לראות למטה.
תתרגל להשתמש בפקודת Get-Member
. תשתמש בה הרבה במאמר זה.
כל פקודה ב-PowerShell שמייצרת פלט יכולה להיות מופנית ל-
Get-Member
. רק תזכור להפוך את הפקודה הזו לאחרונה בצינור כי היא תדרוס את הפלט עם הפלט שלה.
סוגי עצמים ומחלקות
הכלי שלי אינו יכול להסביר את הטקסט המקורי שלך, אך הנה התרגום:
ללא כניסה לפרטים הרבים בתכנות עצמאי, כל אובייקט מכיל "סכימה". "סכימה" של אובייקט היא מחלקה שמכילה את התבנית ליצירת אובייקט. תבנית זו נקראת סוג.
כל אובייקט ב-PowerShell יש סוג ספציפי. לכל אובייקט יש תבנית ממנה נוצר. סוג אובייקט מוגדר על ידי מחלקה. נשים לב לדוגמה: 9 הוא מספר, Bluegill הוא דג, Labrador הוא כלב, וכן הלאה. המחלקה מופיעה לפני הסוג.
אובייקטים הם הופעות של מחלקות עם סוג ספציפי.
אל תדאג אם אתה לא נכנס לעומק בנושא. אלא אם כן אתה מפתח תוכנה, ייתכן שאין לך צורך גדול בסמנטיקה בנושא זה. עם זאת, זו היא רעיון חשוב לדעת ברמה בסיסית.
מאפיינים
הרעיון החשוב ביותר על אובייקטים שעליך להבין הוא מאפיינים. מאפיינים הם תכונות שמתארות את האובייקט. אובייקט יכול לכלול הרבה מאפיינים שונים המייצגים תכונות שונות.
אחת מהדרכים הקלות ביותר לגלות אילו מאפיינים קיימים באובייקטים היא באמצעות הפקודה Get-Member
. תוכל לראות למטה שבאמצעות הפרמטר MemberType
, Get-Member
יגביל את הפלט המוחזר רק לאובייקטים. תראה גם שהוא מציג את סוג האובייקט System.ServiceProcess.ServiceController.

עכשיו נקח את הדוגמה של שירות BITS שנכסה קודם ונסתכל על הערכים הספציפיים של נכסי אותו אובייקט באמצעות הקוד שלמטה. הפקודה Get-Member
מאפשרת לך למצוא את שמות התכונות אך לא את הערכים. באמצעות פקודת ה־Select-Object
של PowerShell, במקרה שלנו, תוכל לבדוק את ערכי התכונות.
מטה תראה שהתכונה StartType
היא תכונה באובייקט. האובייקט שחזר כולל הרבה חברים שונים אך באמצעות פקודת ה־Select-Object
, היא מגבילה את הפלט להצגת התכונה הזו בלבד.

התכונות הן, ברוב המקרים, הרכיב הנפוץ ביותר של אובייקט שתעבוד איתו ב־PowerShell.
כינויים
קיימות תכונות שהן סוג Alias
. כינויים הם כינויים חלופיים לשמות התכונות. הם לעיתים נותנים שמות יותר אינטואיטיביים לתכונות.
תוכל לראות דוגמה לאובייקט עם כינויים באמצעות פקודת ה־Get-Service
שוב כפי שמוצג למטה. התכונה Name
כינוייתה ל־ServiceName
ו־RequiredServices
כינוייתה לתכונת ServicesDependedOn
.

כאשר לתכונה יש כינוי, תוכל להתייחס לערך התכונה הזו באמצעות שמו הכינוי במקום שם התכונה האמיתי. בדוגמה זו, תכונה תיאורטית כמו Name
ו־RequiredServices
היא יותר אינטואיטיבית וקלה יותר להקליד מאשר ServiceName
ו־ServicesDependedOn
.
תוכל לראות דוגמה להתייחסות לכינויים אלו למטה.
אתה אמור לראות את הפלט הבא. שים לב שאתה שומר על הקוד קצר, נקי ומרוכז. המידע זה נשמר, בלתי תלוי אם אתה משתמש בכינוי או לא:

שיטות
מאכלסים הם רק חלק ממה שיוצר אובייקט; שיטות הן גם עקרונית חשובה להבין. שיטות הן הפעולות שניתן לבצע על אובייקט. כמו מאכלסים, תוכל לגלות שיטות באובייקט באמצעות הפקודה Get-Member
.
כדי להגביל את הפלט של Get-Member
למתודות בלבד, הגדר את ערך הפרמטר MemberType
ל־Method
כפי שמוצג למטה.

כמתחיל, יש לך יש לך יש לך יש לך יש לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך לך
סוגים אחרים של חברים
מאכלסים, שיטות וכינויים הם לא היחידים בעלי סוגים של חברים שאובייקט יכול לכלול. עם זאת, הם יהיו, לכמה, הסוגים הנפוצים ביותר של חברים שתתמקד בהם.
למלוא הפרט, להלן כמה סוגים נוספים של חברים שאולי תתקל בהם.
- נכסי סקריפט – משמשים לחישוב ערכי נכסים.
- נכס הערה – משמשים לשמות נכסים סטטיים.
- סטי המאפיינים – אלו דומים לכינויים שמכילים בדיוק את מה שהשם מרמז עליו; סטים של מאפיינים. לדוגמה, יצרת נכס מותאם אישית בשם
Specs
עבור פונקציית ה־Get-CompInfo
שלך.Specs
בעצם תת־סט של המאפיינים Cpu, Mem, Hdd, IP. המטרה העיקרית של סטי המאפיינים היא לספק שם יחיד של מאפיין לחבר קבוצת מאפיינים.
חשוב גם להזכיר את המושג של אירועי אובייקט. אירועים נמצאים מחוץ לטווח המאמר הזה.
עבודה עם אובייקטים ב־PowerShell
עכשיו שיש לך הבנה בסיסית של מה מורכב אובייקט, בוא נתחיל לפעול ולכתוב קוד.
הרבה פקודות PowerShell מייצרות פלט אבל לעיתים אין צורך לראות את כל הפלט הזה. עליך להגביל או לשנות את הפלט בדרך מסוימת. מאושר, PowerShell מציעה מספר פקודות שונות שמאפשרות לך לעשות זאת בדיוק.
בוא נתחיל עם דוגמה של ספירת כל השירותים במחשב המקומי באמצעות הפקודה Get-Service
כפי שמוצג למטה. אתה יכול לראות בפלט שמוחזר רבים שירותים שונים (אובייקטים).

שליטה במאפייני האובייקט המוחזר
המשך עם הדוגמה של Get-Service
, אולי אין צורך לראות כל מאפיין. במקום זאת, רק צריך לראות את המאפיינים Status
ו־DisplayName
. כדי להגביל את המאפיינים שמוחזרים, תשתמש בפקודת Select-Object
.
הפקודה Select-Object
"מסננת" מאפיינים שונים מהמוחזרים לצינור PowerShell. כדי ל"סנן" מאפייני אובייקט מהמוחזרים, תוכל להשתמש בפרמטר Property
ולציין קבוצת מאפיינים מופרדת בפסיקים של אחד או יותר להחזרה.
ניתן לראות מטה דוגמה להחזרת מאפייני Status
ו-DisplayName
בלבד.

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

הצינור [
|
] ב-PowerShell הוא אחת מכמה טכניקות המשך שתשתמש בהן כאשר נדרש. השתמש בו במקום בסימן backticks.
עיבוד אובייקטים
ייתכן שתחליט שאתה לא רוצה לראות את כל השירותים על מכונה. במקום זאת, ייתכן שתרצה להגביל את הפלט לפי קריטריונים מסוימים. דרך אחת לסנן את מספר האובייקטים שיחזורו היא להשתמש ב־Where-Object
cmdlet
. בעוד ש־Select-Object
cmdlet מגביל את הפלט לתכונות מסוימות, ה־Where-Object
cmdlet מגביל את הפלט של כל האובייקטים
. פקודת ה־Where-Object
דומה ל־SQL WHERE clause. היא פועלת כסנן של המקור המקורי כך שתחזיר רק אובייקטים מסוימים שמתאימים לקריטריונים מסוימים
. אולי החלטת שאתה רוצה רק אובייקטים שמחזירים עם ערך של מאפיין Status
שהוא Running
ורק אלה עם ערך של מאפיין DisplayName
שמתחיל ב־A
. ניתן לראות בקטע הקוד הבא שהוספנו ערך של Where-Object
בין Select-Object
ו־Sort-Object
בסדר הצינור. באמצעות ערך של סקריפטבלוק עם תנאי חובה שנוצר עבור כל אובייקט לפגוש דרך הפרמטר FilterScript
, ניתן ליצור כל סוג של שאילתה שתרצה
תבדוק את פקודת
Format-Table
אם תרצה לעצב איך הפלט יוחזר לקונסול.

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

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

פעולה על אובייקטים עם לולאות
כאשר כל אובייקט מעובד דרך הצינור, תוכל לבצע פעולה על כל אובייקט בעזרת לולאה. ישנם סוגים שונים של לולאות בפוורשל אך בדוגמה זו נשארים עם דוגמאות צינור. בוא נתמקד בפקודת ForEach-Object
.
פקודת ForEach-Object
מאפשרת לך לבצע פעולה על כל אובייקט המוזרם אליה. ההתנהגות הזו מתארת בצורה הטובה ביותר עם דוגמה.
המשך שימוש בדוגמת Get-Service
, אולי תרצה למצוא את כל השירותים במחשב עם שם שמתחיל ב-"Windows" ופועלים. באמצעות פקודת Where-Object
, תוכל ליצור את התנאים כפי שעשית קודם.
אך כעת במקום להחזיר אובייקטים שלמים או כמה מאפיינים, תרצה להחזיר את המחרוזת <שם_השירות> פועל עבור כל אובייקט באמצעות הקוד **Write-Host -ForegroundColor 'Yellow' <שם_השירות> "פועל"
.
אתה כעת מניפה את הפלט ויצירת מחרוזת משלך. הדרך היחידה לעשות זאת היא להשתמש בפקודה ForEach-Object
כפי שמוצג למטה. מתחת ניתן לראות ש-לכל אובייקט שמתקבל דרך Where-Object
, PowerShell מריץ את הקוד Write-Host -ForegroundColor 'Yellow' $_.DisplayName "פועל"
.

פקודת ForEach-Object
שימושית בכמה דרכים. לדוגמה, תוכל לבנות בלוגיקה נוספת לספור דרך כל אובייקט שירות ובהתאם לערך במאפיין, לשנות את צבע והמילים של מחרוזת הפלט או לבצע פעולה נוספת כמו להתחיל שירות שנעצר.
תדמיין את האפשרויות שזה נותן לך! עם קצת חשיבה ותכנון, תוכל ליצור סקריפט שיקבל פקודה אחת ויבצע אותה בקלות על פני אובייקטים רבים.
השוואת אובייקטים
לפעמים יש צורך לבדוק שני אובייקטים ולהשוות ערכי מאפיינים.
אולי יש לך שני מערכות ברשת שכמעט זהות. אך, אתה נתקל בבעיה שאתה מצפה להיות בעיה בתצורה עם שירות באחת משתי המערכות.
אתה מסיק שכאשר המערכות האלו נמצאות בסטטוסים שונים ברשת שלך, יהיה עליך להשתמש בפקודות מרחוק כדי לאסוף את המידע בסשן PowerShell. אתה פותח את העורך האהוב עליך ויוצר סקריפט. סקריפט זה, כפי שאתה יכול לראות למטה, מתחבר לשני שרתים שונים וממנה כל התוכניות בכל אחד מהם.
עכשיו כל התוכניות בכל מחשב נלכדו במשתנים $ProcA
ו- $ProcB
. עכשיו עליך להשוות אותם. תוכל לעבור ידנית דרך כל סט של תוכניות או לעשות זאת בדרך הקלה יותר ולהשתמש ב- cmdlet בשם Compare-Object
.
Compare-Object
מאפשר לך להשוות בין ערכי מאפיינים של שני אובייקטים שונים. כל אובייקט קורא לכל מאפיין באובייקט, מסתכל על ערכי המאפיינים שלהם ומחזיר מה ששונה, כברירת מחדל, וגם מה שזהה.
כדי להשתמש ב- Compare-Object
, ציין את הפרמטרים ReferenceObject
ו- DifferenceObject
, ספק את כל אובייקט כערכי הפרמטרים כפי שמוצג למטה.
באופן ברירת המחדל, Compare-Object
יחזיר רק הבחנות באובייקטים שמסומנים על ידי המאפיין SideIndicator
. הסמלים או סמני הצד המשמשים הם >
, <
, ו- =
להצגת התאמה של אובייקטים שמתבצעת השוואה ביניהם.

ניתן להשתמש בפרמטר המתג
IncludeEqual
עםCompare-Object
כדי להחזיר מאפייני אובייקט שהם זהים. אם כן, תראה==
כאינדיקטור צד. באופן דומה, ניתן להשתמש ב־ExcludeDifferent
כדי להשאיר את ההבדלים.
הפקודה Compare-Object
היא פקודה מאוד שימושית. אם ברצונך ללמוד עוד, הקפד לבקר ב־תיעוד האינטרנט.
עבודה עם אובייקטים מותאמים
עכשיו שיש לך הבנה טובה של מהי אובייקט וכיצד ניתן לעבוד עימם, הגיע הזמן ליצור את האובייקטים שלך!
יצירת אובייקטים מהטבלאות האש
דרך אחת ליצור את האובייקטים שלך היא באמצעות שימוש בטבלאות האש. טבלאות האש הן קבוצות של זוגות מפתח/ערך בדיוק מה שאתה צריך ליצירת מאפיינים עבור אובייקט.
בוא נתחיל על ידי יצירת אובייקט PowerShell מותאם אישית עם כמה מפתחות/ערכים באמצעות טבלאות האש. בדוגמה למטה, אתה יוצר טבלה אש. טבלה זו מייצגת אובייקט יחיד ואת המאפיינים שלו. לאחר שהטבלה האש $CarHashtable
הוגדרה, אתה יכול להשתמש ב־PsCustomObject
אקסלרטור סוג.
האצלת התאמה pscustomobject היא דרך מהירה ליצירת מופע של מחלקת pscustomobject. התנהגות זו נקראת קליטה.
בסיום קטע הקוד למטה, יש לך אובייקט ($CarObject
) מסוג pscustomobject עם חמישה מאפיינים שהוקצו אליו.
לעיתים קרובות, ניתן גם להשתמש ב־New-Object
cmdlet. בשימוש באותה הטבלה, במקום להשתמש באצלת ה־pscustomobject, ניתן לעשות זאת בדרך הארוכה יותר עם New-Object
. דוגמה לכך מוצגת למטה.
כאשר נוצר $CarObject
, ניתן כעת לראות למטה שניתן להפנות לכל אחד מהמאפיינים בדיוק כמו אם הם היו מתוך cmdlet פלטני ב־PowerShell כמו Get-Service
.

הוספת והסרת מאפיינים
לא רק ניתן ליצור אובייקטים מותאמים, אלא ניתן גם להוסיף אליהם. זכורים את Get-Member
cmdlet? Get-Member
יש לו דמות קרובה בשם Add-Member
. ה־Add-Member
cmdlet לא מפנה את המינים, הוא מוסיף אותם.
בשימוש באובייקט המותאם שנוצר מראש כדי דוגמה, אולי תרצה להוסיף מאפיין שנת היציבות לאותו אובייקט. ניתן לעשות זאת על ידי פיקוד של אובייקט ל־Add-Member
ולציין:
- הסוג של החבר (במקרה זה פשוט `
NoteProperty
`) - שם המאפיין (
Year
) - ערך המאפיין (
Value
)
ניתן לראות משלך מקרה מדגם למטה.
ניתן לראות מה שמופיע למעלה שזה נראה כמו כל מאפיין אחר.

ניתן להשתמש בטכניקות דומות כדי להוסיף הרבה סוגים שונים של חברים. אם ברצונך לחקור עוד לבד, תסתכל על Add-Member
תיעוד.
באותה קלות ניתן להסיר חבר מאובייקט. אף על פי שאין פקודת Remove-Member
, עדיין ניתן לעשות זאת על ידי קריאה לשיטת Remove()
על האובייקט כפי שמוצג למטה. תלמד על שיטות בקטע הבא.
מבוא מהיר לשיטות
במהלך מאמר זה, עבדת עם מאפיינים. קראת ערכי מאפיינים, יצרת מאפיינים משלך והוספת והסרתם. אך לא עשית הרבה בסביבה. לא שינית דבר בשרת. בוא נקח פעולה עם שיטות.
שיטות מבצעות פעולה מסוימת. אובייקטים אחסון מידע בעוד שיטות מבצעות פעולה.
לדוגמה, יתכן ואתה מודע לפקודת Stop-Service
. פקודה זו מפסיקה שירות בווינדוס. כדי לעשות זאת, תוכל לשלוח אובייקט מ Get-Service
ישירות אל Stop-Service
כדי לבצע את הפעולה.
אתה יכול לראות למטה דוגמה לעצירת שירות BITS. בדוגמה זו, השירות BITS נעצר ואז נבדק המצב כדי לוודא שהוא נעצר. ביצעת שני פעולות עם פקודות cmdlet; עצירת השירות ובדיקת המצב.
במקום להפעיל את Get-Service
פעמיים ולבצע פקודה נפרדת, Stop-Service
, במקום זה, תוכל להשתמש בשיטות שנבנו ישירות לתוך אובייקטי השירות. הרבה אובייקטים יש להם שיטות. במקרה זה, Stop-Service
וההתייחסות השנייה ל- Get-Service
אף אינם נדרשים.

על ידי קריאה לשיטות באובייקט השירות עצמו, תוכל לעצור ולקבל את המצב המעודכן, הכול באמצעות אובייקט יחיד. למטה תראה את זה בפעולה. שים לב שבאמצעות שימוש ב- Stop()
וב- Start()
תוכל לנהל את השירות בדיוק כמו שהפקודות עשו.
כדי לוודא שערך המאפיין Status
מעודכן לאחר שהמצב של השירות שונה, תוכל לקרוא לשיטה Refresh()
שפועלת כמו קריאה נוספת לפקודת Get-Service
.
תראה את הפלט הבא:

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