我的脚本有一个问题:
这里我设置了一个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]
),其元素恰好是键值对对象。
因此,该输出在管道中被枚举。