【问题标题】:How do I find a user by DisplayName in one CSV file given a DistinguishedName is another CSV file?鉴于 DistinguishedName 是另一个 CSV 文件,如何在一个 CSV 文件中按 DisplayName 查找用户?
【发布时间】:2022-01-04 07:19:49
【问题描述】:

我有两个带有制表符分隔值的 CSV 文件。

CSV1:

GivenName   Surname DisplayName  Manager    
John        Smith   John Smith   Oliver Twist

CSV2:

SAMAccountName    mail             DistinguishedName
John Smith      johns@example.com   CN=John Smith,CN=Users,DC=example,DC=com
Oliver Twist    olivert@example.com CN=Oliver Twist,CN=Users,DC=example,DC=com

我想要做的是将 CSV1 与 CSV2 进行比较,并将 CSV1 文件中 Manager 列中的经理名称与 CSV2 DistinguishedName 列值(即"CN=Oliver Twist")相匹配,如本例所示并导出到像这样的新 CSV 文件:

SAMAccountName    mail              Manager
John Smith        johns@example.com Oliver Twist

如前所述,CSV2 文件中可能有数百个可分辨名称,我想要的只是将DistinguishedName 列值"CN=whatever name " 与CSV1 中的Manager 列进行比较和匹配的输出。

这是我尝试过的脚本:

$csv1 = Import-Csv -Path 'C:temp\AD.csv'
$csv2 = Import-Csv -Path 'C:\temp\AD_ExportDN.csv'

$csv3 = foreach ($record in $csv2) {
    $matchingRecord = $csv1 | Where-Object { $_.manager -eq $record.manager }
    # if your goal is to ONLY export records with a matching email address,
    # uncomment the if ($matchingRecord) condition

    #if ($matchingRecord) {
        $record | Select-Object *, @{Name = 'manager'; Expression = {$matchingRecord.DistinguishedName}}
    #}
}

$csv3 | Export-Csv -NoTypeInformation -Force -Path 'C:\temp\merged_for_AD2.csv'

【问题讨论】:

  • 您需要帮助的代码在哪里?发布您尝试过的内容并包含任何错误或相关详细信息。
  • 这些是制表符分隔的值吗?还是固定宽度的列?否则,多列包含空格将使解析更加困难。另外,两个表中的John Smith 条目是如何相关的? CSV1.DisplayName == CSV2.SAMAccountName 似乎是唯一的方法,在这种情况下,为什么不能通过 SAMAccountName 而不是 DistinguishedName 找到 Manager

标签: powershell csv match relationship matching


【解决方案1】:

您的问题启发我为我正在维护的Join-Object script/Join-Object Module 添加一个新功能(另请参阅:In Powershell, what's the best way to join two tables into one?)。
该功能在 issue 中进行了解释:#29 key expressions

在您的情况下,所需的命令将类似于:

$Csv1 |Join $Csv2 -On Manager -Equals { [RegEx]::Match($_.DistinguishedName, '(?<=CN=).*(?=,CN=Users)') }

返回:

GivenName         : John
Surname           : Smith
DisplayName       : John Smith
Manager           : Oliver Twist
SAMAccountName    : Oliver Twist
mail              : olivert@example.com
DistinguishedName : CN=Oliver Twist,CN=Users,DC=example,DC=com

对于具体的正则表达式'(?&lt;=CN=).*(?=,CN=Users)'

  • .* 指的是任何字符序列
    • 前面是CN=(?&lt;=CN=)regex Lookbehind
    • 然后是CN=Users(?=,CN=Users),正则表达式前瞻)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多