arrays - 不使用 Compare-Object 对 If 语句的结果进行排序

标签 arrays powershell sorting compare

我正在尝试创建一个排序函数,将我的对象排序到三个不同的列表中。每个对象在“名称”列下都包含服务器的名称(除其他外)。我正在尝试创建三个列表。一种包含出现在两个对象上的服务器名称,一种包含仅出现在 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/

相关文章:

javascript - 如果另一个 h2 选择关闭当前一个,我如何一次显示一个 h2?

java - 按字母顺序对复杂对象的数组列表进行排序

php - 如何使用 PHP 以自然顺序对数组进行排序

c - 为什么我的程序返回我没有输入的字符? (纯C)

Java - 数组元素的排列 - 解释清楚

php - PHP 如何为数组设置键?

powershell - 使用 Connect-WSMan 会出现错误 : It cannot determine the content type of the HTTP response from the destination computer

xml - 从 XML 到 Excel 的舍入数字

powershell - powershell 脚本格式表输出中的颜色词

java - Java中内置的比较排序