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

[玩转系统] PowerShell - 通过哈希表中的键获取值 [11 种方法]

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

PowerShell - 通过哈希表中的键获取值 [11 种方法]


[玩转系统] PowerShell - 通过哈希表中的键获取值 [11 种方法]

通过单个键获取单个值

我们可以在 PowerShell 中使用以下方式通过哈希表中的单个键获取单个值:

  • 索引器符号
  • .Item() 方法
  • 点符号
  • Where-Object Cmdlet

使用索引器表示法

使用方括号 ([]) 表示的索引器符号在 PowerShell 的 HashTable 中按键获取值。

使用索引器符号:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

$value = $hashTable['Name']
Write-Output $value

输出 :

PowerShell

我们创建了一个包含两个键值对的哈希表,使用 PowerShellName 和使用 7.3Version,并保存它在$hashTable中。然后,我们使用索引器符号 ([]) 通过指定键来获取其值,并将其保存在 $value 变量中。最后,我们使用 Write-Output cmdlet 在控制台上显示 $value 变量的值。

我们还可以使用 Write-Output cmdlet 将给定对象写入管道。如果此 cmdlet 是管道中的唯一命令或最后一个命令,则对象将显示在控制台上。它将对象发送到主管道,即输出流,也称为成功管道;我们通常使用此 cmdlet 在控制台上显示对象和字符串。

使用 .Item() 方法

使用.Item()方法通过哈希表中的键获取值。

使用 .Item() 方法:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

$value = $hashTable.Item('Name')
Write-Output $value

输出 :

PowerShell

此代码示例使用与前面的代码相同的哈希表。在这里,我们使用了 .Item() 方法,该方法将键作为参数并返回我们存储在 $value 变量中的相应值。

$value 随后用于使用 Write-Output cmdlet 在控制台上打印其值。使用 .Item() 并不是一种不同的方法,而是索引器表示法的便捷替代方案。

使用点表示法

使用.表示的点表示法通过哈希表中的键获取值。

使用点符号:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

$value = $hashTable.Name
Write-Output $value

输出 :

PowerShell

上面的示例也类似于最后两个代码片段,使用相同的哈希表并使用 Write-Output cmdlet 写入检索到的值。唯一的区别是我们使用点表示法来访问指定键的值。

使用 Where-Object Cmdlet

使用 Where-Object cmdlet 按哈希表中的键获取值。

使用Where-Object Cmdlet:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

$hashTable.GetEnumerator() | Where-Object {$_.Key -eq 'Name'}

输出 :

Name     Value
----     -----
Name     PowerShell

对于此代码,我们使用 GetEnumerator() 方法获取 $hashTable 的枚举器,该枚举器用于迭代哈希表的键值对。然后,枚举器通过管道传输到 Where-Object cmdlet,该 cmdlet 根据指定条件 $_.Key -eq 'Name' 过滤哈希表,仅返回键值对,其中键等于'Name'。请记住,-eq 是不区分大小写的运算符。

它返回一个对象,其中包含键 'Name' 和值 'PowerShell' 的键值对(请参阅上面的输出)。当我们想要根据特定的键来过滤哈希表的键值对时,我们可以使用上面的解决方案。如果您仅对值感兴趣,则可以使用 .Value 属性,如下所示。

使用Where-Object Cmdlet:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

($hashTable.GetEnumerator() | Where-Object {$_.Key -eq "Name"}).Value

输出 :

PowerShell

通过多个键获取多个值

我们可以在PowerShell中使用以下不同的方法通过哈希表中的多个键获取多个值:

  • -match 运算符
  • ForEach-Object Cmdlet
  • 键数组

使用 -match 运算符

使用 -match 运算符在 PowerShell 中通过哈希表的多个键获取多个值。

使用 -match 运算符:

$hashTable = @{
    'FirstName' = 'John'
    'LastName' = 'Williamson'
    'Course' = 'PowerShell'
}

$hashTable.GetEnumerator() | Where-Object {$_.Key -match 'Name'}

输出 :

Name          Value
----          -----
FirstName     John
LastName      Williamson

此代码示例与我们使用 -eq 运算符通过键获取值的代码示例相同,但我们将 -eq 替换为 - match 运算符用于过滤与模式 Name 匹配的多个键。请注意,-match 运算符不区分大小写,这意味着 NamenameNAmE 都是相同的。

使用 ForEach-Object Cmdlet

使用 ForEach-Object Cmdlet 通过 PowerShell 中的哈希表中的多个键获取多个值。

使用 ForEach-Object Cmdlet:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
    'OS' = 'Windows'
}

$hashTable.GetEnumerator() | ForEach-Object {
  if ($_.Key -eq 'Version') {
    Write-Output $_.Value
  }
  if ($_.Key -eq 'OS') {
    Write-Output $_.Value
  }
}

输出 :

7.3
Windows

我们再次创建了一个具有三个键值对的哈希表。接下来,我们使用 GetEnumerator() 方法获取枚举器对象来迭代 $hashTable 的每个键值对。

然后使用 ForEach-Object cmdlet 对该枚举器进行管道传输,以循环键值对,并在脚本块(用 {} 表示)内检查是否key 等于使用 -eq 运算符的 'Version''OS'

如果为 True,则使用 Write-Output cmdlet 写入指定键的值。当您想要从哈希表中过滤特定的键值对并输出它们的值时,此解决方案会很有帮助。但是,请记住,ForEach-Object 将迭代所有键值对;如果您有一个很大的哈希表,那么就性能而言,这可能是一项昂贵的操作。

使用键数组

使用键数组通过哈希表中的多个键获取多个值。

使用键数组:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
}

$keys = @('Name','Version')
$values = $hashTable[$keys]
Write-Output $values

输出 :

PowerShell
7.3

在这里,我们使用 @() 表示的数组运算符来创建一个包含键('Name''Version')作为数组的数组元素。然后,我们将此数组保存在 $keys 变量中,并传入索引器符号 ([]) 以获取值数组,并将其保存在 $中value 数组供以后使用。

注意: 并不强制使用数组运算符来创建数组,但您可以使用 $keys=('Name', 'Version')$keys='名称', '版本' 也是如此。

获取带/不带键的所有值

我们可以在 PowerShell 中使用以下方法来获取哈希表中带/不带键的所有值:

  • ForEach 循环
  • Where-Object Cmdlet

使用 ForEach 循环

使用 ForEach 循环获取 PowerShell 中哈希表的相应键的所有值。

使用 ForEach 循环:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
    'OS' = 'Windows'
}

ForEach($key in $hashTable.Keys){
    $message = '{0} = {1}' -f $key, $hashTable[$key]
    Write-Output $message
}

输出 :

Name = PowerShell
Version = 7.3
OS = Windows

在这里,我们使用 ForEach 语句(也称为 ForEach 循环)来遍历 $hashTable.Keys 返回的所有键的集合。

对于每个键,我们使用字符串格式化运算符 (-f) 创建了一个格式为 "key=value" 的字符串,其中 "key" > 是循环中的当前键,"value" 是哈希表中与该键关联的值。然后,我们使用 Write-Output cmdlet 将消息输出到控制台。

请注意,有更紧凑的形式为我们提供了相同的结果,并带有标题以便清楚地理解。为此,我们可以使用以下内容:

打印完整的哈希表:

$hashTable

输出 :

Name                           Value
----                           -----
Name                           PowerShell
Version                        7.3
OS                             Windows

或者

打印完整的哈希表:

$hashTable.GetEnumerator()

输出 :

Name                           Value
----                           -----
Name                           PowerShell
Version                        7.3
OS                             Windows

使用 Where-Object Cmdlet

使用 Where-Object cmdlet 获取 PowerShell 中哈希表的所有不带键的值。当我们想要以对象的形式获取所有值时,这种方法非常有用。

使用Where-Object Cmdlet:

$hashTable = @{
    'Name' = 'PowerShell'
    'Version' = 7.3
    'OS' = 'Windows'
}

$hashTable.PSObject.Properties | Where-Object {$_.Name -eq "Values"} | Select Value

输出 :

Value
-----
{PowerShell, 7.3, Windows}

创建具有三个键值对的哈希表后,它访问了 $hashTable 对象的 PSObject 属性及其 Properties 集合。然后,它通过管道传输到 Where-Object 以按属性名称 'Values' 过滤属性集合,然后选择该属性的 Value 属性被过滤的对象。要理解上述命令,请查看以下屏幕截图。

[玩转系统] PowerShell - 通过哈希表中的键获取值 [11 种方法]

或者,我们可以使用 $hashTable.Values 来仅获取值;这个命令更简单。

到目前为止,我们已经学会了如何通过一个键获取一个值,通过多个值获取多个键,以及如何通过哈希表获取所有带键和不带键的值;如果我们需要从包含嵌套键的哈希表中获取值怎么办?让我们看看如何解决这个问题。

获取嵌套键的嵌套值

我们可以在PowerShell中使用以下方式来获取哈希表中嵌套键的嵌套值:

  • 索引器符号
  • 用户自定义函数

使用索引器表示法

使用索引器表示法通过 PowerShell 获取哈希表中嵌套键的值。

使用索引器符号:

$hashtable = @{
    'StudentID' = 11239
    'Name' = @{
        'FirstName' = 'John'
        'LastName' = 'Williamson'
    }
}

$value = $hashtable['Name']['FirstName']
Write-Output $value

输出 :

John

我们已经在本文的第一个方法中了解了索引器表示法。对于上面的代码,我们将其与嵌套键一起使用,这意味着它首先定位 'Name' 键,然后在 'Name' 键中,它定位 'Name' 键>'FirstName' 来检索值。我们可以添加更多索引符号以进行更深入的研究。例如:

使用索引器符号:

$hashtable = @{
    'StudentID' = 11239
    'Addresses' = @{
        'permanentAddress' = @{
            'City' = 'Lahore'
            'Country' = 'Pakistan'
         }
         'temporaryAddress' = @{
            'City' = 'Multan'
            'Country' = 'Pakistan'
         }
    }
}

$hashtable['Addresses']['permanentAddress']['City']
$hashtable['Addresses']['temporaryAddress']['City']

输出 :

Lahore
Multan

使用用户定义函数

要使用 PowerShell 通过哈希表中的键获取值:

  • 创建一个名为 GetValueByKey 的函数来搜索键的值,即使该值是嵌套哈希表
  • 创建一个哈希表。
  • 通过传递两个参数来调用第一步创建的函数;第一个是哈希表对象,第二个是要检索其键的键。

使用用户定义的函数:

function GetValueByKey {
    param (
        [hashTable] $hashTable,
        [string] $key
    )
    $hashTable.GetEnumerator() | ForEach-Object {
        if ($_.Key -eq $key) {
            Write-Output $_.Value
        }
        elseif ($_.Value -is [hashTable]) {
            Get-ValueByKey $_.Value $key
        }
    }
}

$hashTable = @{'Name' = 'PowerShell'; 'Version' = 7.3; 'OS' = 'Windows'}
GetValueByKey $hashTable 'Name'

输出 :

PowerShell

对于这种方法,我们创建了一个名为 GetValueByKey 的函数,它接受两个参数:

  1. $hashTable - 哈希表对象
  2. $key - 表示要在哈希表中搜索的键的字符串值

然后,该函数使用哈希表对象的 GetEnumerator() 方法来迭代哈希表中的每个键值对。对于每一对,它检查键是否等于搜索到的键,如果是,则使用 Write-Output cmdlet 将相应的值写入输出。

如果键的值是哈希表,则该函数将递归调用自身,并将嵌套哈希表和搜索键作为参数传递。这也允许该函数在嵌套哈希表中搜索键。即使该值是嵌套哈希表的值,该函数也会搜索键的值。

值得注意的是,该函数将输出它从输入哈希表及其嵌套哈希表中找到的所有匹配键值。如果您只需要第一个匹配的键值,可以将 Write-Output cmdlet 替换为 return 语句。

这就是如何在 PowerShell 中通过键获取值的全部内容。

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

取消回复欢迎 发表评论:

关灯