קבוצת אובייקטים ב-PowerShell: ארגון הנתונים שלך

כשאתה עובד עם PowerShell, יש רגעים בהם יש צורך לעבוד עם סטים של נתונים. אנו עובדים עם המון קבצים, חשבונות משתמשים, מכונות וירטואליות ועוד. כאשר אתה מציג את האובייקטים השונים הללו בקונסול, האובייקטים יתגלגלו מטה למטה במסך אחרי הם ולא יתחשבו באופן שאתה רוצה לראות אותם. אך זה ניתן לתקן! באמצעות פקודת PowerShell Group-Object, אתה יכול לקבץ אובייקטים יחד. פקודה זו פועלת כמו ההצהרה GROUP BY ב- SQL.

PowerShell יש לו דרך לסכם אובייקטים לפי מאפייניהם דרך פקודת Powershell Group Object. פקודה זו מאפשרת לסקריפטר לקבל תמונה כללית של המאפיינים של האובייקטים הרבים בו זמנית בקבוצות.

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

כדי ש- Group-Object יעבוד כמצופה, וודא שאתה מקבץ רק אובייקטים מאותו סוג. חשוב שכל האובייקטים יש להם את אותם מאפיינים.

PS51> $services = Get-Service
PS51> $services

Status   Name               DisplayName
------   ----               -----------
Stopped  AdtAgent           Microsoft Monitoring Agent Audit Fo...
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
--snip--

ניהול ודיווח על Active Directory, Exchange ו-Microsoft 365 עם ManageEngine ADManager Plus. הורד גרסה דמו בחינם!

Group-Object ללא פרמטרים

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

PS51> $services | Group-Object

Count Name                      Group
----- ----                      -----
  272 AdtAgent                  {AdtAgent, AJRouter, ALG, AppHostSvc...}

שים לב שעל ידי שילוב כל השירותים ל־Powershell Group Object, אתה יכול לקבל את המספר. זה לא משהו גדול אבל שימושי.

קיבוץ אובייקטים לפי מאפיין יחיד

כדי לקבץ אותם לפי מאפיין מסוים (במקרה זה מצב) עלי לספר ל־Group-Object שאני רוצה לקבץ על פי מאפיין מסוים של אובייקט. זה נעשה על ידי שימוש בפרמטר Property על Group-Object.

PS51> $services | Group-Object -Property Status

Count Name                      Grou
----- ----                      -----
  160 Stopped                   {AdtAgent, AJRouter, ALG, AppIDSvc...}
  112 Running                   {AppHostSvc, Appinfo, Appveyor.Server, AudioEndpointBuilder...}

עכשיו אנחנו מדברים! אני יכול לראות כמה שירותים עצרו ופועלים בו זמנית. אני יכול לעשות אותו הדבר עבור StartType גם.

PS51> $services | Group-Object -Property StartType

Count Name                      Group
----- ----                      -----
    9 Disabled                  {AdtAgent, AppVClient, NetTcpPortSharing, RemoteAccess...}
  184 Manual                    {AJRouter, ALG, AppIDSvc, Appinfo...}
   79 Automatic                 {AppHostSvc, Appveyor.Server, AudioEndpointBuilder, Audiosrv...}

סינון פלט של Group-Object

אולי אני רוצה להעמיק ולראות את השירותים האמיתיים באחת או יותר מהקבוצות הללו. אני יכול לקבל את אלה באמצעות הסתכלות על המאפיין Group שמוחזר על ידי פקודת ה־Powershell לקבוצה. האובייקט Group מכיל את כל השירותים שנקבצו לפי ערך המאפיין של אובייקט. כדי לקבל את כל השירותים שעצרו אם אני מקבץ על מצב השירות, אני יכול לסנן את השירותים לפי המצב של Stopped ולאחר מכן להרחיב את האובייקט Group כדי לראות את כל השירותים האלו.

PS51> $services | Group-Object -Property Status | Where {$_.Name -eq 'Stopped'} | Select -ExpandProperty Group

Status   Name               DisplayName
------   ----               -----------
Stopped  AdtAgent           Microsoft Monitoring Agent Audit Fo...
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
Stopped  AppMgmt            Application Management
Stopped  AppReadiness       App Readiness
--snip--

קיבוץ אובייקטים לפי מאפיינים מרובים

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

PS51> $services | Group-Object -Property Status,StartType

Count Name                      Group
----- ----                      -----
    9 Stopped, Disabled         {AdtAgent, AppVClient, NetTcpPortSharing, RemoteAccess...}
  145 Stopped, Manual           {AJRouter, ALG, AppIDSvc, AppMgmt...}
   73 Running, Automatic        {AppHostSvc, Appveyor.Server, AudioEndpointBuilder, Audiosrv...}
   39 Running, Manual           {Appinfo, camsvc, CertPropSvc, ClipSVC...}
    6 Stopped, Automatic        {gpsvc, MapsBroker, sppsvc, TrustedInstaller...}

ניתן לראות שעל ידי הוספת מאפיין נוסף, בגדול תוכל ליצור מספר תרחישים "וגם" ולקבץ על כמה מאפיינים שנדרש!

ניהול ודיווח על מנהל הספרייה הפעילה, החלפה ו-Microsoft 365 עם ManageEngine ADManager Plus. הורדת גרסת ניסיון חינם!

סיכום

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

אם אתה רק מתחיל עם פוורשל, אני ממליץ בחום לבדוק את הקורס הקטן שלי על בניית כלים בפוורשל!

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