比较文本文件 - Powershell

Compare txt files - Powershell

我有两个 txt 文件。两者都包含用户名列表:

列表 1:

user1
user2
user3

列表 2:

user1
user2
user7 

我想比较这两个列表。我想知道哪些用户不存在于两个列表中。 所以这种情况下的输出应该是这个列表:

最终名单:

user3
user7

这是我的代码:

$list1 = get-content -Path "C:\list1.txt"
$list2 = get-content -Path "C:\list2.txt"

$endlist = foreach ($item in $list1) 
{
       if ($item -notmatch $list2)
       {
            [PSCustomObject]@{
            Name = $item 
       }

}
$endlist |Out-file "C:\endlist.txt"

我做错了什么?

使用compare-object

Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 | Select-Object -ExpandProperty InputObject

通常您会为此使用 Compare-Object

$list1 = 'user1', 'user2', 'user3'
$list2 = 'user1', 'user2', 'user7'

(Compare-Object $list1 $list2).InputObject # => user3, user7

如果您想手动进行比较,并且因为您想知道每个列表中唯一的对象,您将需要 两个 循环并使用 containment operator(在本例中为-notin-notcontains):

$list1 = (Get-Content list1.txt).Trim()
$list2 = (Get-Content list2.txt).Trim()

& {
    foreach($i in $list1) {
        if($i -notin $list2) { $i }
    }
    foreach($i in $list2) {
        if($i -notin $list1) { $i }
    }
} | Out-File "endlist.txt"

补充现有的工作解决方案,这是另一个使用 HashSet 的解决方案,它可能比 Compare-Object 更快:

[Collections.Generic.HashSet[string]] $list1 = Get-Content list1.txt
[Collections.Generic.HashSet[string]] $list2 = Get-Content list2.txt

$list1.SymmetricExceptWith($list2)
$list1

输出:

user7
user3

HashSet 奇怪地命名为 1 SymmetricExceptWith 方法 修改 第一个集合只包含那些元素对任何一组都是独一无二的。

1) 数学术语为symmetric difference.