【发布时间】:2018-07-08 01:45:29
【问题描述】:
在 PowerShell 中从 csv 导入数据时,是否可以忽略具有相同名称和姓氏的行。这是一种忽略它们而不是在 AD 中更新它们的方法吗?
我更愿意收到消息
【问题讨论】:
标签: powershell csv active-directory
在 PowerShell 中从 csv 导入数据时,是否可以忽略具有相同名称和姓氏的行。这是一种忽略它们而不是在 AD 中更新它们的方法吗?
我更愿意收到消息
【问题讨论】:
标签: powershell csv active-directory
这绝对是可行的!
首先,假设您有一个这样的用户起始列表
$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678'
$users = $csv | ConvertFrom-Csv
为了知道我们是否已经处理了一个用户,我们需要一种在处理每个用户时跟踪他们的方法,所以我们会在处理每个用户时将它们添加到一个 ArrayList 中,就像这样。
$processed = New-Object System.Collections.ArrayList
ForEach ($user in $users){
#Do your processing here
$null = $processed.Add($user)
}
但我们仍然需要一些逻辑来检查我们之前是否曾为特定用户工作过。我们可以通过检查 $processed 是否包含与我们目前正在处理的 $user 匹配的 Name 和 SurName 来做到这一点。
ForEach ($record in $processed){
if ($record.Name -eq $User.Name){
If ($record.SurName -eq $User.SurName){
Write-Warning "Skipping user $($user.Name) $($user.SurName), ID $($user.ID), already processed"
continue #This Keyword skips this item and continues to the next in the list
}
}
}
把它们放在一起,你就有了。
$users = $csv | ConvertFrom-Csv
$processed = New-Object System.Collections.ArrayList
ForEach ($user in $users){
ForEach ($record in $processed){
if ($record.Name -eq $User.Name){
If ($record.SurName -eq $User.SurName){
Write-Warning "Skipping user $($user.Name) $($user.SurName), ID $($user.ID), already processed"
continue
}
}
}
"importing $($user.Name) $($User.SurName)"
$null = $processed.Add($user)
}
输出如下(请注意,我在列表中有 两个 'Stephen Owen' 条目)
importing Stephen Owen
importing Lindey Owen
WARNING: Skipping user Stephen Owen, ID 3456, already processed
importing Pippin Owen
importing John Elway
【讨论】:
Lindey,Elway,9876 添加到您的 $csv 中,看看会发生什么。您不能单独检查姓名和姓氏。
$Users = Import-Csv 'X:\path\users.csv'
我建议在导入的 csv 中添加一个新属性,其中每个用户都可以获得 First 和 Surname 的组合。从那时起,跳过具有相同全名的那些就很容易了。 (请注意,我已将 LotPings 示例用户放入其中以确保它按预期工作)
$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678
Lindey,Elway,9876
John,Elway,5555'
$users = $csv | ConvertFrom-Csv
# add a column with the first and lastnames combined
foreach ($user in $users) {
$user | Add-Member -MemberType NoteProperty -Name 'FullName' -Value ("{0} {1}" -f $user.Name, $user.Surname)
}
# now create an array with all users except those that have the same 'FullName'
$noDupes = @()
foreach ($user in $users) {
If ($user.FullName -in $noDupes.FullName){
Write-Warning "Skipping user $($user.FullName), ID $($user.ID), already processed"
continue
}
"importing $($user.Name) $($User.SurName)"
$noDupes += ($user)
}
$noDupes
将产生:
importing Stephen Owen
importing Lindey Owen
WARNING: Skipping user Stephen Owen, ID 3456, already processed
importing Pippin Owen
importing John Elway
importing Lindey Elway
WARNING: Skipping user John Elway, ID 5555, already processed
Name Surname ID FullName
---- ------- -- --------
Stephen Owen 1234 Stephen Owen
Lindey Owen 2345 Lindey Owen
Pippin Owen 4567 Pippin Owen
John Elway 5678 John Elway
Lindey Elway 9876 Lindey Elway
编辑
如果你想跳过所有有重复的用户(不仅仅是重复的),你可以使用这样的东西:
$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678
Lindey,Elway,9876
John,Elway,5555'
$users = $csv | ConvertFrom-Csv
# add a column with the first and lastnames combined
foreach ($user in $users) {
$user | Add-Member -MemberType NoteProperty -Name 'FullName' -Value ("{0} {1}" -f $user.Name, $user.Surname)
}
# find all duplicate objects using the 'FullName'
$names = @()
$dupes = @()
foreach ($user in $users) {
If (-not ($user.FullName -in $names)) {
$names += ($user.FullName)
}
else {
$dupes += $user.FullName
Write-Warning "Duplicate user skipped: $($user.FullName)"
}
}
$users = ($users | Where-Object { $_.FullName -notin $dupes })
$users
将产生:
Name Surname ID FullName
---- ------- -- --------
Lindey Owen 2345 Lindey Owen
Pippin Owen 4567 Pippin Owen
Lindey Elway 9876 Lindey Elway
【讨论】:
或者你可以使用 Sort -Unique:
$users | Select-Object -Property @{ Name = "FullName"; Expression = { $_.Name + $_.Surname }}, Name, Surname, ID | Sort-Object FullName -Unique
虽然这不会让您知道用户已被删除。
【讨论】: