[玩转系统] 回归基础:了解 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
现在以前面介绍的 BITS 服务为例,并使用以下代码查看该对象属性的特定值。 Get-Member
cmdlet 允许您查找属性名称,但不能查找值。但是,使用 PowerShell 的 Select-Object
cmdlet,您可以检查属性值。
在下面您可以看到 StartType
是对象的一个属性。返回的对象具有许多不同的成员,但通过使用 Select-Object
cmdlet,它将输出限制为仅显示该属性。
PS51> Get-Service -ServiceName 'BITS' | Select-Object -Property 'StartType'
到目前为止,属性是您将在 PowerShell 中使用的对象的最常见组件。
别名
某些属性的 MemberType
为 Alias
。别名是属性名称的假名。他们有时可以给属性一个更直观的名称。
您可以再次使用 Get-Service
cmdlet 查看带有别名的对象示例,如下所示。属性 Name
的别名为 ServiceName
,RequiredServices
的别名为 ServicesDependedOn
属性。
PS51> Get-Service | Get-Member -MemberType 'AliasProperty'
当属性有别名时,您可以使用别名而不是实际的属性名称来引用该属性的值。在此示例中,像 Name
和 RequiredServices
这样的描述性属性比 ServiceName
和 ServicesDependedOn
更直观、更容易键入。
您可以在下面看到引用这些别名的示例。
# 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
您应该看到以下输出。再次注意,您要保持代码简短、干净和简洁。无论是否使用别名,信息都是相同的:
方法
属性只是创建对象的一部分; 方法也是一个需要理解的重要概念。方法是可以对对象执行的操作。与属性一样,您可以使用 Get-Member
cmdlet 发现对象上的方法。
要将 Get-Member
的输出限制为仅方法,请将 MemberType
参数值设置为 Method
,如下所示。
PS51> Get-Service | Get-Member -MemberType 'Method'
作为初学者,您使用方法的频率远低于使用属性的频率。
其他会员类型
属性、方法和别名并不是对象可以拥有的唯一成员类型。然而,到目前为止,他们将是您合作的最常见的成员类型。
为了完整起见,以下是您可能遇到的一些其他类型的成员。
- 脚本属性 - 这些用于计算属性值。
- 注意 属性 - 这些用于静态属性名称。
- 属性集 - 这些就像别名,仅包含名称所暗示的内容;属性集。例如,您为
Get-CompInfo
函数创建了一个名为Specs
的自定义属性。Specs
实际上是 Cpu、Mem、Hdd、IP 属性的子集。属性集的主要目的是提供单个属性名称来连接一组属性。
提及对象事件的概念也很重要。事件超出了本文的范围。
在 PowerShell 中使用对象
现在您已经对对象的组成有了基本的了解,让我们开始动手并编写一些代码。
许多 PowerShell 命令都会生成输出,但有时您不需要查看所有这些输出。您需要以某种方式限制或操纵该输出。幸运的是,PowerShell 有一些不同的命令可以让您做到这一点。
让我们从使用 Get-Service
cmdlet 枚举本地计算机上的所有服务的示例开始,如下所示。您可以通过输出看到返回许多不同的服务(对象)。
PS51> Get-Service -ServiceName *
控制返回的对象属性
继续使用 Get-Service
示例,也许您不需要查看每个属性。相反,您只需要查看 Status
和 DisplayName
属性。要限制返回的属性,您可以使用 Select-Object
cmdlet。
Select-Object
cmdlet“过滤”返回到 PowerShell 管道的各种属性。要“过滤”返回的对象属性,您可以使用 Property
参数并指定要返回的一组以逗号分隔的一个或多个属性。
您可以在下面看到仅返回 Status
和 DisplayName
属性的示例。
PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName'
对对象进行排序
也许您正在构建一个报告来显示服务及其状态。为了方便信息消化,您希望根据 Status
属性的值对返回的对象进行排序。为此,您可以使用 Sort-Object
cmdlet。
Sort-Object
cmdlet 允许您收集所有返回的对象,然后按照您定义的顺序输出它们。
例如,使用 Sort-Object
的 Property
参数,您可以为 Get-Service
传入的对象指定一个或多个属性以进行排序经过。 PowerShell 会将每个对象传递给 Sort-Object
cmdlet,然后返回按属性值排序的对象。
您可以在下面看到一个示例,该示例使用 Sort-Object
的 Descending
开关参数返回按其Status
排序的所有服务对象,正确返回按降序排列。
PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName' |
Sort-Object -Property 'Status' -Descending
PowerShell 中的管道 [ |
] 是必要时应使用的几种行延续技术之一。使用它而不是反引号。
过滤对象
也许您决定不想看到计算机上的所有服务。相反,您需要通过特定标准限制输出。过滤返回的对象数量的一种方法是使用 Where-Object
cmdlet。
Select-Object
cmdlet 限制特定属性的输出,而 Where-Object
cmdlet 则限制整个对象的输出。
Where-Object
cmdlet 的功能与 SQL WHERE 子句类似。它充当原始源的过滤器,仅返回符合特定条件的某些对象。
也许您已决定只希望返回 Status
属性值为 Running
的对象,并且只返回 DisplayName
属性值以A
。
您可以在下一个代码片段中看到 Where-Object
引用按管道顺序插入到 Select-Object
和 Sort-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
对返回的对象进行计数和平均
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 个对象。
也许您只是在寻找返回的对象总数。由于 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 中有不同类型的循环,但仍以管道示例为例,让我们研究一下 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"
}
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
,请指定 ReferenceObject
和 DifferenceObject
参数,将每个对象提供为参数值,如下所示。
Compare-Object -ReferenceObject $ProcA -DifferenceObject $ProcB
默认情况下,Compare-Object
将仅返回 SideIndicator
属性指示的对象中的差异。使用的符号或侧面指示符是>
、
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag