如何用For Loop修改PowerShell脚本,仅当邮箱重复时追加location_id?
问题解决:仅在邮箱重复时添加location_id到邮箱地址
现有file.csv内容
id,location_id,name,title,email,directorate 1,1,Amy Lee,Singer,,, 2,2,brad Pitt,Actor,bpitt@example.com,Production 3,5,steven spielberg,Producer,Screenwriter, spielberg@example.com,Production 4,8,Andy lee,Comedian,,Radio
原PowerShell脚本
$inputFile = Import-Csv -Path $filePath $text = (Get-Culture).TextInfo foreach ($line in $inputFile) { $name = $line.name $line.name = $text.ToTitleCase($name) $firstName = $line.name.split(" ")[0] $lastName = $line.name.split(" ")[1] $line.email = ($firstName[0] + $lastName + $line.location_id + "@abc.com").toLower() } $inputFile | Export-Csv $fullPath
需求说明
仅当生成的邮箱地址重复时,才在邮箱中追加location_id,参考示例输出:
id,location_id,name,title,email,directorate 1,1, Amy Lee,Singer,alee1@example.com,, 2,2,Brad Pitt,Actor,bpitt@example.com,Production 3,5,Steven Spielberg,Producer,Screenwriter,sspielberg@example.com,Production 4,8,Andy Lee,Comedian,alee8@example.com,Radio
解决方案(使用For循环实现)
要实现需求,需分三步处理:先生成基础邮箱(不带location_id)、统计重复情况、再根据重复状态生成最终邮箱。具体脚本如下:
$inputFile = Import-Csv -Path $filePath $text = (Get-Culture).TextInfo # 第一步:统一姓名格式,生成基础邮箱(不带location_id)并暂存 foreach ($line in $inputFile) { $line.name = $text.ToTitleCase($line.name.Trim()) $firstName = $line.name.Split(" ")[0] $lastName = $line.name.Split(" ")[1] # 新增临时属性存储基础邮箱 $line | Add-Member -MemberType NoteProperty -Name "BaseEmail" -Value ($firstName[0] + $lastName + "@example.com").ToLower() -Force } # 第二步:统计每个基础邮箱的重复次数,存入哈希表快速查询 $emailCounts = $inputFile | Group-Object -Property BaseEmail -AsHashTable -AsString # 第三步:用For循环遍历,根据重复情况生成最终邮箱 for ($i = 0; $i -lt $inputFile.Count; $i++) { $line = $inputFile[$i] # 原CSV已有邮箱的,直接保留原内容 if (-not [string]::IsNullOrWhiteSpace($line.email)) { continue } # 检查基础邮箱是否重复 if ($emailCounts[$line.BaseEmail] -gt 1) { # 重复则在邮箱前缀后追加location_id $prefix = $line.BaseEmail.Split("@")[0] $domain = $line.BaseEmail.Split("@")[1] $line.email = ($prefix + $line.location_id + "@" + $domain).ToLower() } else { # 不重复则直接使用基础邮箱 $line.email = $line.BaseEmail } # 移除临时属性,避免导出到CSV中 $line.PSObject.Properties.Remove("BaseEmail") } # 导出处理后的结果 $inputFile | Export-Csv -Path $fullPath -NoTypeInformation
代码说明
- 第一步先统一姓名的标题格式,同时生成不带
location_id的基础邮箱,用临时属性BaseEmail暂存,避免重复计算。 - 第二步用
Group-Object统计每个基础邮箱的出现次数,哈希表结构能快速判断某邮箱是否重复。 - 第三步用For循环逐行处理:
- 原CSV已有邮箱的行(如示例中第2、3行)直接跳过,保留原数据;
- 若基础邮箱重复,就在邮箱前缀后追加
location_id;不重复则直接使用基础邮箱; - 最后移除临时属性,保证导出的CSV结构干净。
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

