Powershell 对于一个CSV中的每个内容,检查另一个CSV中的多种匹配类型

Powershell 对于一个CSV中的每个内容,检查另一个CSV中的多种匹配类型,powershell,csv,Powershell,Csv,如果描述不清楚,很抱歉,但我想不出还有什么别的说法 我有两个CSV文件: LocalAdmins.csv--ColumnA=PC name;ColumnB=本地管理组中的用户名 export.csv——ColumnA=电脑名称;ColumnB=允许作为本地管理员的用户名 我试图做的是在LocalAdmins.csv中循环,每次检查电脑名是否显示在export.csv中(或与该文件中定义的命名模式匹配),如果找到匹配项,检查LocalAdmins.csv中该电脑的本地管理员用户名是否显示在ex

如果描述不清楚,很抱歉,但我想不出还有什么别的说法

我有两个CSV文件:

LocalAdmins.csv--ColumnA=PC name;ColumnB=本地管理组中的用户名

export.csv——ColumnA=电脑名称;ColumnB=允许作为本地管理员的用户名

我试图做的是在LocalAdmins.csv中循环,每次检查电脑名是否显示在export.csv中(或与该文件中定义的命名模式匹配),如果找到匹配项,检查LocalAdmins.csv中该电脑的本地管理员用户名是否显示在export.csv中该电脑的允许用户列表中

如果用户名不在AllowedUsers列表中,或者PC名称不在employment.csv中,则从LocalAdmins.csv输出条目。以下是我到目前为止的情况:

$admins = Import-Csv .\LocalAdmins.csv
$exempt = Import-Csv .\Exempt.csv
$violations = ".\Violations.csv"

foreach ($admin in $admins) {
    foreach ($item in $exempt) {
        if ($admin.PC -like $item.PC) {
            if ($admin.Name -notin ($item.AllowedUsers -split ",")) {
                $admin | Export-Csv $violations -Append -NoTypeInformation
            }
        }
        else {
            $admin | Export-Csv $violations -Append -NoTypeInformation
        }
    }
}
问题是嵌套的foreach循环会生成重复的输出,这意味着如果在empture.csv中有3行,那么LocalAdmins.csv中的单个条目将有3个重复的输出(empture.csv中每行一个)。因此,输出如下所示:

当它看起来像这样时:

我猜问题出在循环结构的某个地方,但我只是需要一些帮助来找出需要调整的地方。非常感谢您的任何意见

未优化(任何属性的唯一排序都应该有效):


forEach有更好的限制,不应该有重复项
而且不需要排序-唯一

从这里获取输入字符串

## Q:\Test\2019\02\05\SO_54523868.ps1
$admins = @'
PC,NAME
XYZlaptop,user6
workstationXYZ,user7
computerABC,user8
ABClaptop,user1
'@ | ConvertFrom-Csv # .\LocalAdmins.csv

$exempt = @'
PC,AllowedUsers
*laptop,"user1,user2"
computerXYZ,"user3,user4"
workstation*,"user5"
'@ | ConvertFrom-Csv # .\Exempt.csv

$violationsFile = ".\Violations.csv"

$violations = foreach ($admin in $admins) {
    $violation = $True
    foreach ($item in ($exempt|Where-Object {$admin.PC -like $_.PC})){
        if ($admin.NAME -in ($item.AllowedUsers -split ',')){
            $violation = $False
        }
    }
    if ($violation){$admin}    
}
$violations
$violations | Export-Csv $violationsFile -NotypeInformation
## with Doug Finke's ImportExcel module  installed, you can directly get the excel file:
#$violations | Export-Excel .\Violatons.xlsx -AutoSize -Show

我想试试看。。。但是你发布了这两个来源的照片。我不会把你已经有的东西作为文本输入。。。[皱眉]
## Q:\Test\2019\02\05\SO_54523868.ps1
$admins = @'
PC,NAME
XYZlaptop,user6
workstationXYZ,user7
computerABC,user8
ABClaptop,user1
'@ | ConvertFrom-Csv # .\LocalAdmins.csv

$exempt = @'
PC,AllowedUsers
*laptop,"user1,user2"
computerXYZ,"user3,user4"
workstation*,"user5"
'@ | ConvertFrom-Csv # .\Exempt.csv

$violationsFile = ".\Violations.csv"

$violations = foreach ($admin in $admins) {
    $violation = $True
    foreach ($item in ($exempt|Where-Object {$admin.PC -like $_.PC})){
        if ($admin.NAME -in ($item.AllowedUsers -split ',')){
            $violation = $False
        }
    }
    if ($violation){$admin}    
}
$violations
$violations | Export-Csv $violationsFile -NotypeInformation
## with Doug Finke's ImportExcel module  installed, you can directly get the excel file:
#$violations | Export-Excel .\Violatons.xlsx -AutoSize -Show