PowerShellでオブジェクトをグループ化する:データの整理

PowerShellを使用する際には、データのセットを操作する必要があることがあります。ファイル、ユーザーアカウント、仮想マシンなど、さまざまなオブジェクトを操作します。これらのオブジェクトをコンソールに表示する場合、オブジェクトはスクリーン上を次々にスクロールして表示され、表示方法に関係なく表示されます。しかし、これは修正可能です!PowerShellのGroup-Objectコマンドレットを使用すると、オブジェクトをグループ化することができます。このコマンドレットはSQLのGROUP BYステートメントのように機能します。

PowerShellには、Powershell Group Objectコマンドレットを介してプロパティごとにオブジェクトを要約する方法があります。このコマンドレットを使用すると、スクリプタは一度に多くのオブジェクトプロパティを一覧表示することができます。

同じタイプのオブジェクトのバンチを生成しましょう。これらのオブジェクトは任意のタイプであることができます。ただし、このデモンストレーションでは、Get-Serviceコマンドレットが返すSystem.ServiceProcess.ServiceControllerオブジェクトを使用します。

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コマンドレットにパイプし、Statusプロパティを使用します。

PS51> $services | Group-Object

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

すべてのサービスをPowershell Group Objectにパイプすることで、カウントを取得することができます。大したことではありませんが、便利です。

単一のプロパティでオブジェクトをグループ化する

特定のプロパティ(この場合は状態)でグループ化するには、Group-Objectに対してPropertyパラメーターを使用する必要があります。

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の出力をフィルタリングする

これらのグループの1つまたは複数の実際のサービスを見たい場合があるかもしれません。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コマンドレットは、共通のプロパティに基づいてオブジェクトをグループ化するのに役立つコマンドレットです。このようにオブジェクトをグループ化することは、さまざまな方法で役立ちます。 Group-Objectコマンドレットの動作について少し学んでいただくことで、PowerShellスクリプトを改善し、より良いものを作成するためのアイデアを得ていただければと思います!

PowerShellを始めたばかりの方は、PowerShellツールビルディングのミニコースをぜひご覧ください!

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