PowerShell中如何为Import-CSV对象添加Tier 0用户的Tier 1副本
解决PowerShell中CSV添加重复记录的问题
之前方法的问题
- 方法一:直接将哈希表追加到
$csv数组中,Import-Csv返回的是PSCustomObject类型的数组,哈希表和PSCustomObject类型不兼容,会导致数组中混合不同类型的对象,后续遍历或操作时会出错。 - 方法二:
Add-Member是给单个对象添加属性,你却给整个数组对象添加属性,这不是添加新的记录,而是给数组本身增加了额外属性,完全不符合需求。
正确实现方式
可以通过创建一个新集合,先包含原所有记录,再遍历原数据添加符合条件的新记录。具体代码如下:
# 导入CSV数据 $csv = Import-Csv csvfile.csv # 初始化结果集合,先加入原所有记录 $result = @($csv) # 遍历原数据,为Tier为0的用户添加Tier=1的记录 foreach ($user in $csv) { # 清理Tier字段的空格并判断 if (($user.Tier -replace '\s', '') -eq '0') { # 创建新的PSCustomObject,复制原用户的FirstName和LastName,设置Tier为1 $newUser = [PSCustomObject]@{ FirstName = $user.FirstName LastName = $user.LastName Tier = '1' } # 将新记录添加到结果集合 $result += $newUser } } # 此时$result包含原所有记录和新增的Tier=1的重复记录,可直接用于foreach遍历
代码说明
- 使用
@($csv)初始化结果集合,确保它是数组类型,方便后续追加元素。 - 对于每个Tier为0的用户,创建同类型的PSCustomObject(和
Import-Csv返回的对象类型一致),避免类型不匹配的问题。 - 最终
$result数组包含原所有数据,以及每个Tier=0用户对应的Tier=1记录,可直接用于后续的foreach循环遍历。
你也可以用更简洁的管道方式实现:
$csv = Import-Csv csvfile.csv $result = $csv + ($csv | Where-Object { ($_.Tier -replace '\s', '') -eq '0' } | ForEach-Object { [PSCustomObject]@{ FirstName = $_.FirstName LastName = $_.LastName Tier = '1' } })
这种方式先筛选出Tier=0的记录,转换为Tier=1的对象后和原数组合并,结果和上面的方法一致。
内容的提问来源于stack exchange,提问作者Zombievirus
相关产品推荐
相关产品推荐

