Powershell 对于一个CSV中的每个内容,检查另一个CSV中的多种匹配类型
如果描述不清楚,很抱歉,但我想不出还有什么别的说法 我有两个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输出条目。以下是我到目前为止的情况: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
$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