键和值的哈希集



我的脚本有一个问题:

这里我设置了一个var remotefilehash:

$remotefilehash = $remotefiles -replace '^[a-f0-9]{32}(  )', '$0=  ' | ConvertFrom-StringData

创建一个哈希表

然后将这些哈希值与本地哈希集 中的哈希值进行比较
# Create a hash set from the local hashes.
$localHashSet = [System.Collections.Generic.HashSet[string]] $localmd5
# Loop over all remote hashes to find those not among the local hashes.
$diffmd5 = $remotefilehash.Keys.Where({ -not $localHashSet.Contains($_) })

这让我得到哈希键,但我随后还需要得到这些键的哈希值,这些键在上面找到…

这将创建一个散列表

实际上,它创建了一个数组哈希表,因为ConvertFrom-StringData每个管道输入对象转换为一个单独的哈希表。

要创建单个哈希表,首先将输入行连接起来形成单个字符串-注意-join "`n"如何应用于-replace操作的结果以形成单个多行字符串:

$remotefilehash = 
($remotefiles -replace '^[a-f0-9]{32}(  )', '$0=  ' -join "`n") |
ConvertFrom-StringData

要枚举键值对而不仅仅是哈希表(类)对象的(.Keys),您需要使用它的.GetEnumerator()方法:

$diffmd5 = 
$remotefilehash.GetEnumerator().Where({ -not $localHashSet.Contains($_.Key) })

必须显式请求枚举数的原因是PowerShell默认将哈希表/字典视为单个对象,该对象作为一个整体通过管道传递给枚举方法,如.Where().ForEach()数组方法。

注意,上面命令的输出不是本身是一个散列表,而是一个常规的类似数组的集合(类型为[System.Collections.ObjectModel.Collection[psobject]),其元素恰好是键值对对象。
因此,该输出在管道中被枚举。

相关内容

  • 没有找到相关文章

最新更新