[玩转系统] PowerShell 按名称获取对象属性值 [9 种方法]
作者:精品下载站 日期:2024-12-14 05:30:38 浏览:14 分类:玩电脑
PowerShell 按名称获取对象属性值 [9 种方法]
通过名称获取对象的第一级属性值
在PowerShell中,我们有多种方法可以通过对象的名称来获取对象的第一级属性值。在深入研究解决方案之前,必须了解如何在 PowerShell 中创建对象(如果您已经了解,可以跳转到解决方案)。我们将使用以下对象来实现通过名称获取对象的第一级属性的所有解决方案。
在 PowerShell 中创建对象:
$props = $([ordered]@{
firstName="John"
lastName="Williamson"
age=30
})
$object = New-Object PSObject -Property $props
$object
输出 :
firstName lastName age
--------- -------- ---
John Williamson 30
首先,我们使用哈希表创建包含在 @{}
内的 key=value
对。 [ordered]
选项用于使属性按照创建的顺序排列;否则,无论何时显示属性,它们都会以随机顺序排列。然后,我们将有序哈希表括在括号 (()
) 中,并在其前面添加 $
前缀,以告诉 PowerShell 计算 () 内的整个表达式
作为一个整体,然后将返回值分配给 $props
变量。
成功创建所需属性后,我们使用 New-Object
cmdlet 创建一个对象并将其存储在 $object
变量中。这个$object
拥有存储在$props
中的所有属性;我们使用 -Property
参数指定它。接下来,我们使用 New-Object
cmdlet 和 PSObject
类将给定属性作为 NoteProperty
添加到对象中。当我们指定该对象上不存在的特定属性时,将创建 NoteProperty
。请记住,如果您不针对此特定用例使用 PSObject
类,您将收到由 New-Object
cmdlet 生成的非终止错误。
使用点表示法
使用点表示法 (.
) 在 PowerShell 中按名称获取对象属性值。
使用点符号:
$object.firstName
$object.lastName
$object.age
输出 :
John
Williamson
30
使用Select-Object
Cmdlet
使用 Select-Object
cmdlet 在 PowerShell 中按名称获取对象的一个属性值。
使用选择对象 Cmdlet:
$object | Select-Object firstName
输出 :
firstName
---------
John
使用 Select-Object
cmdlet 在 PowerShell 中按名称获取对象的多个属性值。
使用选择对象 Cmdlet:
$object | Select-Object firstName, lastName, age
输出 :
firstName lastName age
--------- -------- ---
John Williamson 30
使用 Select-Object
cmdlet 和 -ExpandProperty
参数在 PowerShell 中仅按名称获取对象属性值。
将 Select-Object 与 -ExpandProperty 一起使用:
$object | Select-Object -ExpandProperty firstName
输出 :
John
在上面的示例中,$object
是我们用来访问其属性的对象。我们将 $object
通过管道传输到 Select-Object
cmdlet,以使用其属性名称获取其属性值。请注意,Select-Object
cmdlet 用于选择对象或对象集的指定属性,并显示具有属性名称及其值的对象。如果您只想获取属性值,请将 -ExpandProperty
参数与 Select-Object
cmdlet 结合使用(我们在第三个代码片段中使用了它)。
Select-Object
cmdlet 的 -ExpandProperty
参数用于检索对象的指定单个属性的值,并将其作为新对象展开到输出流中。请记住,您将收到一条错误消息,指出它无法将 System.Object[]
转换为 ExpandProperty
参数所需的 System.String
类型如果您尝试使用 -ExpandProperty
来展开 $object
的多个属性,因为它仅适用于一个属性。
我们还可以使用 Select
别名在 PowerShell 中按名称获取对象属性值。 Select
是Select-Object
cmdlet 的别名。因此,在上面的示例中将 Select-Object
替换为 Select
也是可行的。
使用 Get-Member
Cmdlet
使用 Get-Member
cmdlet 在 PowerShell 中按名称获取对象的一个属性值。
使用获取成员 Cmdlet:
$object | Get-Member -MemberType NoteProperty firstName
输出 :
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
firstName NoteProperty string firstName=John
使用 Get-Member
cmdlet 在 PowerShell 中按名称获取对象的多个属性值。
使用获取成员 Cmdlet:
$object | Get-Member -MemberType NoteProperty firstName, lastName
输出 :
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
firstName NoteProperty string firstName=John
lastName NoteProperty string lastName=Williamson
使用带有 -ExpandProperty
参数的 Get-Member
cmdlet 在 PowerShell 中仅按名称获取对象属性值。
使用获取成员 Cmdlet:
$strObj = $object |
Get-Member -MemberType NoteProperty firstName |
Select-Object -ExpandProperty Definition
$strObj.Split('=')[1]
输出 :
John
在上面的示例中,我们将 $object
通过管道传输到 Get-Member
cmdlet 以检索特定属性或多个属性(以逗号分隔);请参阅第一个和第二个代码示例。我们使用 -MemberType
参数告诉 Get-Member
cmdlet 要检索什么,是否是 Method
、Property
或NoteProperty;我们提到 NoteProperty
是因为我们想要访问我们创建的属性。
第三个代码片段与第一个和第二个示例类似,但有一些额外的内容。它还将 $object
通过管道传输到 Get-Member
cmdlet,并将 -MemberType
参数设置为 NoteProperty
以进行检索firstName
属性。此处,Get-Member
生成具有 Name
、MemberType
和 Definition
的 PSCustomObject
> 属性。您使用 $object | Get-Member -MemberType NoteProperty firstName
来查看它们。
我们将此 PSCustomObject
通过管道传输到 Select-Object
cmdlet,该 cmdlet 选择 Definition
属性并使用 -ExpandProperty
扩展它> 参数。现在,我们将有一个字符串类型对象,如string firstName=John
;您可以使用 $object | 查看它Get-Member -MemberType NoteProperty 名字|选择对象-展开属性定义
命令。
我们将此字符串对象存储在 $strObj
变量中,并链接 Split()
方法以使用 =
分割 $strObj
作为分隔符。 Split()
方法返回一个具有两个值的子字符串数组:string firstName
和 John
。我们使用索引运算符 ([1]
) 检索索引 1
处的元素,即 John
。
我们还可以使用 gm
别名在 PowerShell 中获取指定成员。 gm
是 Get-Member
cmdlet 的别名。因此,在上面的示例中将 Get-Member
替换为 gm
也是可行的。
我们使用 ForEach-Object
cmdlet 迭代多个字符串对象以获取所有属性的值,如下所示。
将 gm Alias 与 ForEach-Object Cmdlet 结合使用:
$object |
gm -MemberType NoteProperty |
Select-Object -ExpandProperty Definition |
ForEach-Object { $_.Split('=')[1] }
输出 :
30
John
Williamson
在上面的示例中,我们静态地提及属性名称来获取其值,如果对象有一些属性,这很好。但是,在现实世界的问题中,一个对象可以具有数百个属性,并且很难记住所有这些属性。
在这种情况下,我们编写一个脚本,接受属性名称作为用户输入并检索其值。对于这个特定的用例可以使用什么方法?下面我们就来学习一下它们。请记住,如果用户不提供属性名称,脚本将生成错误。
使用 Invoke-Expression
Cmdlet
使用 Invoke-Expression
cmdlet 在 PowerShell 中按名称获取对象的一个属性值。
使用调用表达式 Cmdlet:
$propName = Read-Host "Please enter property name"
Invoke-Expression "`$object.$propName"
输出 :
Please enter property name: firstName
John
使用 Invoke-Expression
cmdlet 在 PowerShell 中按名称获取对象的多个属性值。
使用调用表达式 Cmdlet:
$propNames = Read-Host "Enter property names (comma-separated)"
Invoke-Expression "`$object | Select-Object $propNames"
输出 :
Enter property names (comma-separated): firstName,age
firstName age
--------- ---
John 30
在第一个代码示例中,我们使用 Read-Host
cmdlet 从用户获取一个属性名称并将其存储在 $propName
变量中。然后,我们使用 Invoke-Expression
cmdlet 将字符串 "$object.$propName"
计算为 PowerShell 表达式。此字符串表达式使用 $propName
变量的值访问 $object
上的给定属性。我们使用反引号来转义 $
字符,以便可以将其视为文字字符串而不是变量引用。
第二个代码围栏与第一个代码围栏类似,但它从用户那里获取多个属性名称,用逗号分隔并存储在 $propNames
变量中。它还使用反引号来转义字符串表达式中的 $
字符,但字符串表达式是 $object |这次选择对象 $propNames
。此处,Invoke-Expression
cmdlet 运行动态命令,以从我们通过管道传输到 Select-Object
cmdlet 的 $object
检索特定属性。如何? $propNames
已展开并用作 Select-Object
cmdlet 的参数,该 cmdlet 从 $object
检索给定的属性。
使用脚本块
使用脚本块在 PowerShell 中按名称获取对象的一个属性值。
使用脚本块:
$propName = Read-Host "Please enter property name"
$scriptBlock = { param($object) $object.$propName }
& $scriptBlock $object
输出 :
Please enter property name: firstName
John
使用脚本块在PowerShell中按名称获取对象的多个属性值。
使用脚本块:
$propNames = Read-Host "Enter property names (comma-separated but not have space before/after a comma)"
$scriptBlock = {
param($object, $propNames) $object |
Select-Object -Property ($propNames -split ',')
}
& $scriptBlock $object $propNames
输出 :
Enter property names (comma-separated but not have space before/after a comma): firstName,age
firstName age
--------- ---
John 30
在第一个代码示例中,我们使用 Read-Host
cmdlet 从用户获取一个属性名称并将其存储在 $propName
变量中。然后,我们使用 {}
创建了一个脚本块并将其存储在 $scriptBlock
变量中。此脚本块使用 param
函数接受 $object
作为参数,并返回 $object 上
。最后,我们使用 $propName
的值&
运算符通过指定 $object
作为参数来调用 $scriptBlock
。
第二个代码示例与第一个代码示例类似,但从用户处获取多个属性名称,这些名称以逗号分隔并存储在 $propNames
变量中。这里,在脚本块中,param
函数接受两个参数:$object
和 $propNames
并返回 $propNames 的值
在 $object
上。如何?我们使用 Select-Object
和 -Property
参数从通过管道传递给它的对象中选择指定的属性。
请注意,-split
运算符用于根据逗号 (,
) 拆分 $propNames
;这里,使用逗号作为分隔符。最后,我们使用 &
运算符调用 $scriptBlock
并传入 $object
和 $propNames
变量:参数。
对变量使用点表示法
在 PowerShell 中使用点符号和变量来按名称获取对象的一个属性值。
对变量使用点表示法:
$propName = Read-Host "Please enter property name"
$object.($propName)
输出 :
Please enter property name: firstName
John
在变量中使用点表示法,可以在 PowerShell 中按名称获取对象的多个属性值。
对变量使用点表示法:
$propNames = Read-Host "Please enter property name (comma-separated but not have space before/after a comma)"
$propNames -split "," | foreach {$object.($_)}
输出 :
Please enter property name (comma-separated but not have space before/after a comma): firstName,age
John
30
在第一个示例中,我们使用 Read-Host
cmdlet 从用户获取属性名称并将其存储在 $propName
变量中。然后,我们使用点符号和变量 $object.($propName)
来获取指定对象的给定属性名称的值。
第二个代码片段与第一个代码片段类似,但接受用户提供的多个属性名称(用逗号分隔)并将它们存储在 $propNames
变量中。然后,我们使用 -split
运算符以 ,
作为分隔符来分割 $propNames
。执行分割操作后,我们得到了一个子字符串数组,并将其通过管道传输到 foreach 循环。然后,对于接收到的子字符串数组中的每一项,我们使用点符号和变量 ($_
) 来获取每个属性的值。
当对变量使用点表示法时,括号是可选的。
通过名称获取对象的嵌套属性值
我们已经在按名称获取对象的第一级属性值部分中学习了如何使用 PowerShell 创建对象。就嵌套属性而言,我们可以通过两种方式创建它们:
- 使用嵌套哈希表
- 使用 PSCustomObject
我们在下面提供了两种方式;您可以使用其中任何一个;所有提供的解决方案都适用于创建嵌套属性的两种方法。
使用嵌套哈希表具有嵌套属性的对象:
$props = $([ordered]@{
firstName="John"
lastName="Williamson"
age=30
Address = @{
Street = "245 Main Street"
City = "Lahore"
}
})
$object = New-Object PSObject -Property $props
$object
输出 :
firstName lastName age Address
--------- -------- --- -------
John Williamson 30 {City, Street}
使用 PSCustomObject 具有嵌套属性的对象:
$props = $([ordered]@{
firstName="John"
lastName="Williamson"
age=30
Address = [pscustomobject]@{
Street = "245 Main Street"
City = "Lahore"
}
})
$object = New-Object PSObject -Property $props
$object
输出 :
firstName lastName age Address
--------- -------- --- -------
John Williamson 30 @{Street=245 Main Street; City=Lahore}
您是否创建了具有嵌套属性的对象?然后,让我们转向解决方案。
使用点表示法
在 PowerShell 中使用点表示法通过嵌套属性名称获取对象的嵌套属性值。
使用点符号:
$object.Address.City
$object.Address.Street
输出 :
Lahore
245 Main Street
使用Select-Object
Cmdlet
使用 Select-Object
cmdlet 在 PowerShell 中通过嵌套属性名称获取对象的嵌套属性值。
使用选择对象 Cmdlet:
$object | Select-Object -ExpandProperty Address | Select-Object {$_.City}
输出 :
$_.City
-------
Lahore
或者,我们可以按如下方式获取 City
属性值。如果您想要自定义计算属性名称,则此方法最适合。
使用选择对象 Cmdlet:
$object |
Select-Object -ExpandProperty Address |
Select-Object @{Name='NestedValue';Expression={$_.City}}
输出 :
NestedValue
-----------
Lahore
我们在前面的部分中探讨了 Select-Object
和 -ExpandProperty
。在第一个示例中,$_.City
是我们检索其值的默认计算属性名称(在运行时创建)。
另一方面,在第二个示例中,我们使用 Select-Object
cmdlet @{}
语法创建自定义计算的属性名称(适用于显示有意义的属性名称) )。在 @{}
内部,我们使用了两个变量名称:Name
和 Expression
,其中 Name
是计算属性姓名。相反,Expression
设置为用于计算计算属性名称值的表达式。
在本例中,表达式为 $_.City
,这意味着 NestedValue
属性的值将是当前对象 ($_
)。
使用 Get-Variable
Cmdlet
使用 Get-Variable
cmdlet 在 PowerShell 中通过嵌套属性名称获取对象的嵌套属性值。
使用 Get-Variable Cmdlet:
$varName = "object.Address"
$value = (Get-Variable -Name ($varName.Split('.')[0]) -ValueOnly).
($varName.Split('.')[1])
$value.Street
$value.City
输出 :
245 Main Street
Lahore
我们使用 "object.Address"
值初始化了 $varName
变量。该变量表示要从 PowerShell 对象访问哪个属性。
然后,我们使用 Get-Variable
cmdlet 和点表示法检索由 $varName
给定的嵌套属性的值。 Get-Variable
用于通过将变量名称 "object"
指定为参数来检索 $object
变量的值。运行 Get-Variable -Name ($variableName.Split('.')[0])
命令来查看 Get-Variable
返回的内容。
在这里,我们使用 Split()
方法将 "object.Address"
字符串拆分为使用 .
作为分隔符的子字符串数组。该子字符串数组包含两项:“object”
和 “Address”
。 “object”
(第一个子字符串)用作 Get-Variable
的参数,它返回 $object
变量的值。
“Address”
(第二个子字符串)用作属性名称来检索 $object
的嵌套属性。点表示法用于获取对象的嵌套属性;然后该值被存储在$value
中。
现在,$value
包含 $object
的嵌套 Address
属性的值,该属性可能是另一个 PowerShell 对象或哈希表,具体取决于您用于创建嵌套属性的方法,具有 Street
和 City
属性。
这就是 PowerShell 通过名称获取对象属性值的全部内容。
猜你还喜欢
- 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