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

[玩转系统] PowerShell 按名称获取对象属性值 [9 种方法]

作者:精品下载站 日期:2024-12-14 05:30:38 浏览:14 分类:玩电脑

PowerShell 按名称获取对象属性值 [9 种方法]


[玩转系统] 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-Objectcmdlet 用于选择对象或对象集的指定属性,并显示具有属性名称及其值的对象。如果您只想获取属性值,请将 -ExpandProperty 参数与 Select-Object cmdlet 结合使用(我们在第三个代码片段中使用了它)。

Select-Object cmdlet 的 -ExpandProperty 参数用于检索对象的指定单个属性的值,并将其作为新对象展开到输出流中。请记住,您将收到一条错误消息,指出它无法将 System.Object[] 转换为 ExpandProperty 参数所需的 System.String 类型如果您尝试使用 -ExpandProperty 来展开 $object 的多个属性,因为它仅适用于一个属性。

我们还可以使用 Select 别名在 PowerShell 中按名称获取对象属性值。 SelectSelect-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 要检索什么,是否是 MethodProperty或NoteProperty;我们提到 NoteProperty 是因为我们想要访问我们创建的属性。

第三个代码片段与第一个和第二个示例类似,但有一些额外的内容。它还将 $object 通过管道传输到 Get-Member cmdlet,并将 -MemberType 参数设置为 NoteProperty 以进行检索firstName 属性。此处,Get-Member 生成具有 NameMemberTypeDefinitionPSCustomObject > 属性。您使用 $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 firstNameJohn。我们使用索引运算符 ([1]) 检索索引 1 处的元素,即 John

我们还可以使用 gm 别名在 PowerShell 中获取指定成员。 gmGet-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 创建对象。就嵌套属性而言,我们可以通过两种方式创建它们:

  1. 使用嵌套哈希表
  2. 使用 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 @{} 语法创建自定义计算的属性名称(适用于显示有意义的属性名称) )。在 @{} 内部,我们使用了两个变量名称:NameExpression,其中 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 对象或哈希表,具体取决于您用于创建嵌套属性的方法,具有 StreetCity 属性。

这就是 PowerShell 通过名称获取对象属性值的全部内容。

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

取消回复欢迎 发表评论:

关灯