当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 了解 PowerShell 组对象命令

作者:精品下载站 日期:2024-12-14 20:49:04 浏览:14 分类:玩电脑

了解 PowerShell 组对象命令


使用 PowerShell 时,有时需要处理数据集。我们处理大量文件、用户帐户、虚拟机等。当您在控制台中显示这些不同的对象时,这些对象将在屏幕上一个接一个地向下滚动,而不考虑您希望如何查看它们。但这是可以解决的!使用 PowerShell Group-Object cmdlet,您可以将对象分组在一起。此 cmdlet 的作用类似于 SQL GROUP BY 语句。

PowerShell 可以通过 Powershell Group Object cmdlet 按对象的属性来汇总对象。此 cmdlet 允许脚本编写者一次获得大量对象属性的鸟瞰图。

让我们生成一堆相同类型的对象。这些对象可以是任何类型。不过,在本演示中,我将使用 Get-Service cmdlet 返回的 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--

不带参数的组对象

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

过滤组对象输出

也许我想深入了解其中一个或多个组的实际服务。我可以通过查看 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-Object 上的 Property 参数添加另一个属性名称。

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

你可以通过添加一个额外的属性来查看;您基本上可以创建一堆“和”场景,并根据需要对尽可能多的属性进行分组!

概括

Group-Object cmdlet 是一个可帮助您根据公共属性将类似对象分组在一起的 cmdlet。像这样对对象进行分组可以通过多种方式派上用场。我希望通过了解一点 Group-Object cmdlet 的工作原理,您将获得更多关于如何改进和创建更好的 PowerShell 脚本的想法!

如果您刚刚开始使用 PowerShell,我强烈建议您查看我的有关 PowerShell 工具构建的迷你课程!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯