تجميع الكائنات في PowerShell: تنظيم بياناتك

عند العمل مع PowerShell، هناك أوقات تحتاج فيها إلى العمل مع مجموعات من البيانات. نعمل مع الكثير من الملفات وحسابات المستخدمين والآلات الافتراضية، وأكثر من ذلك. عند عرض هذه الكائنات المختلفة في وحدة التحكم، ستتمدد الكائنات على الشاشة واحدة تلو الأخرى دون مراعاة لكيفية رغبتك في رؤيتها. ولكن يمكن تصحيح ذلك! باستخدام أمر Group-Object في PowerShell، يمكنك تجميع الكائنات معًا. يعمل هذا الأمر على النحو الذي يعمل به الجملة 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 object. يحتوي الكائن 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...}

يمكنك أن ترى من خلال إضافة خاصية إضافية؛ يمكنك ببساطة إنشاء مجموعة من السيناريوهات “و” وتجميعها حسب الحاجة إلى قدر الممكن على العديد من الخصائص!

إدارة وتقرير الدليل النشط، وExchange وMicrosoft 365 مع ManageEngine ADManager Plus. حمل النسخة التجريبية المجانية!

الملخص

أمر Group-Object هو أمر يساعدك في تجميع الكائنات المتشابهة معًا استنادًا إلى خاصية مشتركة. يأتي تجميع الكائنات مثل هذا بمساعدة في العديد من الطرق المختلفة. آمل من خلال تعلم القليل عن كيفية عمل أمر Group-Object، أن تحصل على المزيد من الأفكار حول كيفية تحسين وإنشاء سكريبتات PowerShell أفضل!

إذا كنت للتو بدأت في استخدام PowerShell، فأنصحك بشدة بالتحقق من دورتي الصغيرة حول بناء أدوات PowerShell!

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