我正在尝试创建一个排序函数,将我的对象排序到三个不同的列表中。每个对象在“名称”列下都包含服务器的名称(除其他外)。我正在尝试创建三个列表。一种包含出现在两个对象上的服务器名称,一种包含仅出现在 txtFile 对象上的服务器名称,一种包含仅出现在 csvFile 对象上的服务器名称。这是我到目前为止所拥有的:
If ($txtFile.Name -contains $csvFile.Name) {
$onBothLists += $csvFile.Name
}
ElseIf ($txtFile.Name -notcontains $csvFile.Name) {
$onlyOnTxtFile += $txtFile.Name
}
ElseIf ($csvFile.Name -notcontains $txtFile.Name) {
$onlyOnCsvFile += $csvFile.Name
}
我的问题是,当我运行此命令时,$onBothLists
和 $onlyOnTxtFile
会填充,而 $onlyOnCsvFile
不会。但是,当我为它们运行 Compare-Object
时,它会按照我的预期输出三个列表。我的逻辑有问题吗?
最佳答案
您可以自己循环列表,但是 Compare-Object
already does all the iterating and comparison you need 。您只需随后过滤结果即可。 This is made easy by Group-Object
.
Compare-Object
返回一个对象列表,每个对象包含 2 个属性:原始对象 ( .InputObject
) 和在哪个列表中找到结果对象的指示符 ( .SideIndicator
),其中显示 ==
对于两个方向的物体,或者对于一个方向的火箭 <=
和=>
。
通过在侧面指示器上进行分组并将分组结果指定为 [hashtable]
我们可以轻松地通过并排指示器对该表进行索引以获得所需的结果:
$list1 = echo serverA serverB serverC serverD serverE
$list2 = echo serverD serverE serverF serverG serverH
$grouped = Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 -IncludeEqual |
Group-Object -Property SideIndicator -AsHashTable -AsString
# both
$grouped['=='].InputObject
# in list1
$grouped['<='].InputObject
# in list2
$grouped['=>'].InputObject
对于相同的,您可以这样做:
Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 -IncludeEqual -ExcludeDifferent
关于arrays - 不使用 Compare-Object 对 If 语句的结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886784/