在 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 命令,并使用 Status 属性。

PS51> $services | Group-Object

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

注意,通过将所有服务传递给 Powershell Group Object,你可以得到数量。这很重要但也很有用。

按照单个属性分组对象

要按照特定属性(在这种情况下是状态)对它们进行分组,我需要告诉 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 输出

也许我想深入了解一个或多个这些组中的实际服务。我可以通过查看 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/