powershell 从csv1中查找不在csv2中的项目并导出

edqdpe6u  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(112)

我正在尝试使用powershell来查找新添加到Active Directory组的用户。我每天都将组成员导出到csv中,现在正在尝试通过比较前一天和当天的csv文件来获取新添加的组成员。
下面是我用来检查前一天的csv中是否不存在来自当天csv的用户的函数(这意味着他们是新添加的)。

$file1 = Import-Csv -path "C:\test\members_previous.csv" 
$file2 = Import-Csv -path "C:\test\members_Current.csv" 

foreach ($Item in $file2.samaccountname)
{
    if ($Item -in $file1.samaccountname)
    {
        $true
    }
    else
    {
        $item
    }
  
}

export-csv -path "C:\test|result.csv" -NoTypeInformation

导出的csv文件中不包含任何内容。
我不知道如何只将else语句的结果导出到csv中。else语句中的“$item”值包含用户的samaccountname。
我想解决办法可能很简单,但我想不出来。
提前感谢您的任何建议!

kg7wmglp

kg7wmglp1#

我将假设您的问题代码中缺少一些东西,Export-Csv将需要一个“输入对象”来执行任何操作,而目前没有。
使用Where-Object过滤所有samaccountname值未出现在引用CSV(前一天)中的对象可以简化您的工作:

$ref = Import-Csv "C:\test\members_previous.csv" 

Import-Csv "C:\test\members_Current.csv" |
    Where-Object { $_.samaccountname -notin $ref.samaccountname } |
        Export-Csv C:\test\result.csv -NoTypeInformation

如果两个CSV都非常大,那么您可能需要稍微更改代码,以便提高效率:

$ref = Import-Csv "C:\test\members_previous.csv" |
    Group-Object samaccountname -NoElement -AsHashTable -AsString

Import-Csv "C:\test\members_Current.csv" |
    Where-Object { -not $ref.ContainsKey($_.samaccountname) } |
        Export-Csv C:\test\result.csv -NoTypeInformation
ktca8awb

ktca8awb2#

@santiagosquarzon的回答稍有改进。

# Create output file
$outFile = "c:\test\report.csv"

$outData = New-Object -TypeName System.Text.StringBuilder
[void]$outData.AppendLine("samAccountName,Status")

# Create the dictionary based on the previous members results
$content = Import-CSV -Path c:\test\members_previous.csv
$lookup = $content | Group-Object -AsHashTable -AsString -Property samAccountName

$count = 0

# Start cycling through the master list
Import-Csv -Path c:\test\members_current.csv | foreach {
    $samAccountname = $PSItem.samaccountname
    $found = $lookup[$samAccountname]
    if ($found)
    {
        $status = "Match"
    }
    else
    {
        $status = "No Match"
        $count++
    }
    [void]$outData.AppendLine("`"$samAccountName`",`"$status`"")
}

# Write the output to a file
$outData.ToString() | Out-File -FilePath $outFile -Encoding ascii
Write-Host "Found $count unmatched systems" -ForegroundColor Yellow

相关问题