PowerShell에서 객체 그룹화: 데이터 구성하기

PowerShell을 사용할 때는 데이터 세트를 처리해야 할 때가 있습니다. 우리는 많은 파일, 사용자 계정, 가상 머신 등과 작업합니다. 이러한 다양한 개체를 콘솔에 표시할 때, 원하는 대로 보기 위해 객체들은 한 줄씩 화면에서 아래로 스크롤됩니다. 하지만 이는 수정할 수 있습니다! PowerShell의 Group-Object cmdlet을 사용하면 객체들을 그룹화할 수 있습니다. 이 cmdlet은 SQL GROUP BY 문과 유사하게 작동합니다.

PowerShell은 Powershell Group Object cmdlet을 통해 객체의 속성을 요약하는 방법이 있습니다. 이 cmdlet을 사용하면 한 번에 여러 객체 속성을 그룹으로 볼 수 있습니다.

동일한 유형의 객체를 생성해 보겠습니다. 이 객체들은 어떤 유형이든 될 수 있습니다. 그러나 이 데모에서는 System.ServiceProcess.ServiceController 객체를 사용하겠습니다. 이 객체는 Get-Service cmdlet이 반환하는 것입니다.

예상대로 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--

ManageEngine ADManager Plus를 사용하여 Active Directory, Exchange 및 Microsoft 365을 관리하고 보고하세요. 무료 평가판 다운로드!

매개 변수 없이 Group-Object

Get-Service은 내 로컬 머신에 있는 모든 서비스를 반환합니다. 여기에는 많은 서비스가 있기 때문에 그들의 상태, 시작 유형 등에 대한 감을 얻을 수 없습니다. 먼저 이러한 서비스를 상태별로 그룹화하려고 합니다. 이를 위해 모든 서비스 객체를 PowerShell의 Group-Object cmdlet으로 파이핑하고 Status 속성을 사용할 것입니다.

PS51> $services | Group-Object

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

모든 서비스를 Powershell Group Object로 파이핑하면 개수를 얻을 수 있습니다. 큰 문제는 아니지만 유용합니다.

단일 속성에 따라 객체를 그룹화

특정 속성 (이 경우 상태)으로 그룹화하려면 Group-Object에게 특정 객체 속성을 그룹화하려는 것을 알려야 합니다. 이는 Group-ObjectProperty 매개변수를 사용하여 수행됩니다.

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 출력 필터링

아마도 나는 여기에 있는 하나 이상의 그룹에서 실제 서비스를 확인하고 싶을 것입니다. PowerShell 그룹 객체 명령에서 반환된 Group 속성을 확인하여 이러한 객체를 얻을 수 있습니다. 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--

여러 속성에 따라 객체를 그룹화

단일 속성에 대한 객체를 이렇게 그룹화할 수 있을 뿐만 아니라 여러 속성에 대해서도 그룹화할 수 있습니다. 아마도 상태와 시작 유형에 따라 모든 서비스를 보고 싶으실 것입니다. 이를 위해 Group-ObjectProperty 매개변수에 다른 속성 이름을 추가하기만 하면 됩니다.

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...}

추가 속성을 추가함으로써 별도의 “그리고” 시나리오를 만들고 필요한 만큼 많은 속성에 대해 그룹화할 수 있습니다!

ManageEngine ADManager Plus를 사용하여 Active Directory, Exchange 및 Microsoft 365를 관리하고 보고하세요. 무료 평가판 다운로드!

요약

Group-Object cmdlet은 공통 속성을 기반으로 객체를 그룹화하는 데 도움을 주는 cmdlet입니다. 이와 같이 객체를 그룹화하는 것은 다양한 방법으로 유용합니다. Group-Object cmdlet이 작동하는 방식에 대해 조금이라도 배우시면 PowerShell 스크립트를 개선하고 더 나은 스크립트를 작성하는 데 도움이 될 것이라고 기대합니다!

PowerShell을 시작한 지 얼마 안 되셨다면 PowerShell 도구 구축 미니 코스를 확인하는 것을 강력히 권장합니다!

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