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

[玩转系统] 回归基础:了解 PowerShell 对象

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

回归基础:了解 PowerShell 对象


PowerShell 是一种功能强大的语言。但是是什么让这种脚本语言如此强大呢? PowerShell 对象。这些神奇的对象是什么以及 PowerShell 如何使用它们?请继续关注以找出答案。

PowerShell 是一种面向对象的语言和 shell。这与 cmd 和 Bash 等传统 shell 不同。这些传统的 shell 专注于文本(又名字符串),虽然仍然有用,但其功能有限。 PowerShell 中几乎所有内容都是对象。

在本文中,您将学习有关 PowerShell 中对象的一些关键概念。在本文结束时,您将了解如何通过有用的示例代码和可视化将这些知识应用到您自己的脚本中。

如果您更喜欢视觉学习,请随意观看下面本文的配套视频。

所以系好安全带!您将获得一次难忘的体验,它将帮助您掌握 PowerShell 中对象的概念!

先决条件

在本文中,您将通过实践方法了解 PowerShell 中的对象。如果您选择遵循并尝试代码示例,Windows PowerShell 5.1 或任何版本的 PowerShell 6+ 都应该可以工作。但是,您看到的所有示例都将在使用 Windows PowerShell 5.1 的 Windows 10 build 1903 上执行。

了解对象的解剖结构

PowerShell 中对象无处不在。您可能会问自己“对象是什么样的?”在第一部分中,您将大致了解对象的组成部分。一旦您对对象为何成为对象有一个广泛的了解,您就可以深入研究一些代码示例!

使用 Get-Member 发现对象成员

对象有许多不同类型的与之相关的信息。在 PowerShell 中,此信息有时称为“成员”。对象成员是一个通用术语,指与对象关联的所有信息。

要发现有关对象(成员)的信息,您可以使用 Get-Member cmdlet。 Get-Member cmdlet 是一个方便的命令,可让您查找 PowerShell 中任何对象的可用属性、方法等。

例如,假设您想要查看通过 Get-Service cmdlet 返回的特定对象的成员。您可以通过将 Get-Service 命令的输出通过管道传输到 Get-Member cmdlet 来实现此目的,如下所示。

Get-Service -ServiceName 'BITS' | Get-Member

习惯 Get-Member cmdlet。您将在本文中大量使用它。

PowerShell 中生成输出的每个命令都可以通过管道传输到 Get-Member。请记住将此 cmdlet 作为管道中的最后一个,因为它将用自己的输出覆盖输出。

对象类型和类

无需详细讨论面向对象编程,每个对象都有一个“模式”。对象的“模式”是一种模板,其中包含创建对象的蓝图。该蓝图称为类型

PowerShell 中的每个对象都有特定的类型。每个对象都有一个创建它的蓝图。对象类型由类定义。考虑这个例子; 9 是数字Bluegill鱼,拉布拉多狗,等等。 类位于类型之前。

对象是具有特定类型的类的实例

不要担心深入这个话题。除非您是软件开发人员,否则此时您可能不需要过多担心语义。然而,这是一个需要在基础层面上了解的重要概念。

特性

您应该了解的关于对象的最重要的概念是属性。属性是描述对象的属性。一个对象可以附加许多不同的属性来表示不同的属性。

发现对象上存在哪些属性的最简单方法之一是使用 Get-Member cmdlet。您可以在下面看到,通过使用 MemberType 参数,Get-Member 将限制仅返回对象的输出。您还会看到它还显示 System.ServiceProcess.ServiceController 的对象类型。

PS51> Get-Service | Get-Member -MemberType Property

[玩转系统] 回归基础:了解 PowerShell 对象

现在以前面介绍的 BITS 服务为例,并使用以下代码查看该对象属性的特定值。 Get-Member cmdlet 允许您查找属性名称,但不能查找值。但是,使用 PowerShell 的 Select-Object cmdlet,您可以检查属性值。

在下面您可以看到 StartType 是对象的一个属性。返回的对象具有许多不同的成员,但通过使用 Select-Object cmdlet,它将输出限制为显示该属性。

PS51> Get-Service -ServiceName 'BITS' | Select-Object -Property 'StartType'

[玩转系统] 回归基础:了解 PowerShell 对象

到目前为止,属性是您将在 PowerShell 中使用的对象的最常见组件。

别名

某些属性的 MemberTypeAlias。别名是属性名称的假名。他们有时可以给属性一个更直观的名称。

您可以再次使用 Get-Service cmdlet 查看带有别名的对象示例,如下所示。属性 Name 的别名为 ServiceNameRequiredServices 的别名为 ServicesDependedOn 属性。

PS51> Get-Service | Get-Member -MemberType 'AliasProperty'

[玩转系统] 回归基础:了解 PowerShell 对象

当属性有别名时,您可以使用别名而不是实际的属性名称来引用该属性的值。在此示例中,像 NameRequiredServices 这样的描述性属性比 ServiceNameServicesDependedOn 更直观、更容易键入。

您可以在下面看到引用这些别名的示例。

# Use the AliasProperty in place of an actual property name
PS51> $Svc = Get-Service -ServiceName 'BITS' #Object you are working with
PS51> $Svc.Name
BITS
PS51> $Svc.RequiredServices

您应该看到以下输出。再次注意,您要保持代码简短、干净和简洁。无论是否使用别名,信息都是相同的:

[玩转系统] 回归基础:了解 PowerShell 对象

方法

属性只是创建对象的一部分; 方法也是一个需要理解的重要概念。方法是可以对对象执行的操作。与属性一样,您可以使用 Get-Member cmdlet 发现对象上的方法。

要将 Get-Member 的输出限制为仅方法,请将 MemberType 参数值设置为 Method,如下所示。

PS51> Get-Service | Get-Member -MemberType 'Method'

[玩转系统] 回归基础:了解 PowerShell 对象

作为初学者,您使用方法的频率远低于使用属性的频率。

其他会员类型

属性、方法和别名并不是对象可以拥有的唯一成员类型。然而,到目前为止,他们将是您合作的最常见的成员类型。

为了完整起见,以下是您可能遇到的一些其他类型的成员。

  • 脚本属性 - 这些用于计算属性值。
  • 注意 属性 - 这些用于静态属性名称。
  • 属性集 - 这些就像别名,仅包含名称所暗示的内容;属性集。例如,您为 Get-CompInfo 函数创建了一个名为 Specs 的自定义属性。 Specs 实际上是 Cpu、Mem、Hdd、IP 属性的子集。属性集的主要目的是提供单个属性名称来连接一组属性。

提及对象事件的概念也很重要。事件超出了本文的范围。

在 PowerShell 中使用对象

现在您已经对对象的组成有了基本的了解,让我们开始动手并编写一些代码。

许多 PowerShell 命令都会生成输出,但有时您不需要查看所有这些输出。您需要以某种方式限制或操纵该输出。幸运的是,PowerShell 有一些不同的命令可以让您做到这一点。

让我们从使用 Get-Service cmdlet 枚举本地计算机上的所有服务的示例开始,如下所示。您可以通过输出看到返回许多不同的服务(对象)。

PS51> Get-Service -ServiceName *

[玩转系统] 回归基础:了解 PowerShell 对象

控制返回的对象属性

继续使用 Get-Service 示例,也许您不需要查看每个属性。相反,您只需要查看 StatusDisplayName 属性。要限制返回的属性,您可以使用 Select-Object cmdlet。

Select-Object cmdlet“过滤”返回到 PowerShell 管道的各种属性。要“过滤”返回的对象属性,您可以使用 Property 参数并指定要返回的一组以逗号分隔的一个或多个属性。

您可以在下面看到仅返回 StatusDisplayName 属性的示例。

PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName'

[玩转系统] 回归基础:了解 PowerShell 对象

对对象进行排序

也许您正在构建一个报告来显示服务及其状态。为了方便信息消化,您希望根据 Status 属性的值对返回的对象进行排序。为此,您可以使用 Sort-Object cmdlet。

Sort-Object cmdlet 允许您收集所有返回的对象,然后按照您定义的顺序输出它们。

例如,使用 Sort-ObjectProperty 参数,您可以为 Get-Service 传入的对象指定一个或多个属性以进行排序经过。 PowerShell 会将每个对象传递给 Sort-Object cmdlet,然后返回按属性值排序的对象。

您可以在下面看到一个示例,该示例使用 Sort-ObjectDescending 开关参数返回按其Status 排序的所有服务对象,正确返回按降序排列。

PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName' |
	Sort-Object -Property 'Status' -Descending

[玩转系统] 回归基础:了解 PowerShell 对象

PowerShell 中的管道 [ | ] 是必要时应使用的几种行延续技术之一。使用它而不是反引号。

过滤对象

也许您决定不想看到计算机上的所有服务。相反,您需要通过特定标准限制输出。过滤返回的对象数量的一种方法是使用 Where-Object cmdlet。

Select-Object cmdlet 限制特定属性的输出,而 Where-Object cmdlet 则限制整个对象的输出。

Where-Object cmdlet 的功能与 SQL WHERE 子句类似。它充当原始源的过滤器,仅返回符合特定条件的某些对象。

也许您已决定只希望返回 Status 属性值为 Running 的对象,并且只返回 DisplayName 属性值以A

您可以在下一个代码片段中看到 Where-Object 引用按管道顺序插入到 Select-ObjectSort-Object 之间。使用脚本块值以及通过 FilterScript 参数为每个对象创建的所需条件,您可以制作您想要的任何类型的查询。

如果您想控制输出返回到控制台的方式,请查看 Format-Table cmdlet。

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object -FilterScript {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending | Format-Table -AutoSize

[玩转系统] 回归基础:了解 PowerShell 对象

对返回的对象进行计数和平均

Get-Service 命令返回许多不同的对象。使用 Where-Object cmdlet,您已过滤掉这些对象的一部分,但有多少?介绍 Measure-Object cmdlet。

Measure-Object cmdlet 是一个 PowerShell 命令,除其他数学运算外,它还可以计算通过管道接收的对象数量。

也许您想知道组合命令运行时最终返回了多少个对象。您可以将最终输出通过管道传输到 Measure-Object cmdlet,以查找返回的对象总数,如下所示。

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending | Measure-Object

命令处理完成后,您将看到,在本例中,返回了最初使用 Get-Service cmdlet 创建的 21 个对象。

[玩转系统] 回归基础:了解 PowerShell 对象

也许您只是在寻找返回的对象总数。由于 Measure-Object 命令返回通过 Count 属性找到的对象总数,因此您可以再次引用 Select-Object cmdlet。但这一次,只返回 Count 属性。

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending |
			Measure-Object |
				# We start over again, filtering first, formatting last
				Select-Object -Property 'Count'

[玩转系统] 回归基础:了解 PowerShell 对象

对带有循环的对象执行操作

由于每个对象都是通过管道处理的,因此您可以使用循环对每个对象执行操作。 PowerShell 中有不同类型的循环,但仍以管道示例为例,让我们研究一下 ForEach-Object cmdlet。

ForEach-Object cmdlet 允许您对流入其中的每个对象执行操作。这种行为最好用一个例子来解释。

继续使用 Get-Service 示例,也许您希望查找 Windows 计算机上名称以“Windows”开头且正在运行的所有服务。使用 Where-Object cmdlet,您可以像之前一样创建条件。

Where-Object -FilterScript {$_.DisplayName -Like "Windows*" -and $_.Status -eq 'Running'}

但现在您不想返回整个对象甚至几个属性,而是希望使用代码 **Write-Host -ForegroundColor ' 返回每个对象的字符串 is running黄色'“正在运行”

您现在正在操作输出并创建您自己的字符串。执行此操作的唯一方法是使用 ForEach-Object cmdlet,如下所示。下面您可以看到,对于通过 Where-Object 返回的每个对象,PowerShell 运行代码 Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running “

PS51> Get-Service -ServiceName * |
	Where-Object {$_.DisplayName -Like "Windows*" -and $_.Status -eq 'Running'} | 
		Foreach-Object {
			Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running"
		}

[玩转系统] 回归基础:了解 PowerShell 对象

ForEach-Object cmdlet 在很多方面都很有用。例如,您可以构建附加逻辑来枚举找到的每个服务对象,并根据属性值更改输出字符串的颜色和措辞,甚至执行附加操作,例如启动已停止的服务。

想象一下这为您提供的可能性!只需稍加思考和规划,您就可以创建一个脚本,该脚本接受一个命令并轻松地在多个对象上执行它。

比较对象

有时您需要查看两个对象并比较属性值。

也许您的网络上有两个几乎相同的系统。但是,您在两个系统之一上遇到了预期的服务配置问题。

您得出的结论是,由于这些系统位于网络的不同部分,因此您将需要使用远程命令在 PowerShell 会话中收集信息。您打开您最喜欢的编辑器并创建一个脚本。如下所示,该脚本连接到两个不同的服务器并枚举每个服务器上的所有进程。

$A = 'Svr01a.contoso.com'
$B = 'Svr02b.contoso.com'

$ProcA = Invoke-Command -Computername $A -Scriptblock {Get-Process -Name *}
$ProcB = Invoke-Command -ComputerName $B -Scriptblock {Get-Process -Name *}

您现在已经在 $ProcA$ProcB 变量中捕获了每台计算机上的所有进程。您现在需要对它们进行比较。您可以手动查看每组进程,也可以使用简单的方法并使用名为 Compare-Object 的 cmdlet。

Compare-Object 允许您比较两个不同对象的属性值。此 cmdlet 读取每个对象中的每个属性,查看它们的值,然后返回默认情况下的不同之处以及相同之处。

要使用 Compare-Object,请指定 ReferenceObjectDifferenceObject 参数,将每个对象提供为参数值,如下所示。

Compare-Object -ReferenceObject $ProcA -DifferenceObject $ProcB

默认情况下,Compare-Object 将仅返回 SideIndicator 属性指示的对象中的差异。使用的符号或侧面指示符>

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

取消回复欢迎 发表评论:

关灯