PowerShell中判断修改后对象是否存在于CSV导入列表的问题
问题原因与解决方法
为什么Contains返回False
Contains方法默认判断的是对象引用是否相同,而非属性值是否一致。你通过$value.PSObject.Copy()创建了新的对象实例,哪怕它的所有属性和CSV2里的对象完全匹配,这两个对象在内存中是独立的,所以Contains会返回False。
正确的判断方式
方法1:通过属性值对比判断存在性
如果你的对象有唯一标识属性(比如Name和IP组合唯一),可以直接遍历CSV2检查属性匹配:
替换代码中的判断逻辑:
# 替换原if(!($CSV2.contains($obj)))语句 $exists = $CSV2 | Where-Object { $_.Name -eq $obj.Name -and $_.IP -eq $obj.IP } if (-not $exists) { $myList.Add($value) | Out-Null }
如果需要验证所有属性完全一致,可以用以下逻辑:
$exists = $CSV2 | Where-Object { $props = $obj.PSObject.Properties.Name foreach ($prop in $props) { if ($_.$prop -ne $obj.$prop) { return $false } } return $true } if (-not $exists) { $myList.Add($value) | Out-Null }
修改后的完整代码
$CSV1 = Import-CSV $path $delimiter $header $CSV2 = Import-CSV $path2 $delimiter $header $myList = New-Object -TypeName 'System.Collections.ArrayList' Foreach($value in $CSV1) { $obj = $value.PSObject.Copy() $obj.Name = GetNameRef($value.Name) $obj.IP = GetIPRef($value.IP) # 基于属性值判断对象是否存在 $exists = $CSV2 | Where-Object { $_.Name -eq $obj.Name -and $_.IP -eq $obj.IP } if (-not $exists) { $myList.Add($value) | Out-Null } } $myList | Format-Table * | Out-File ".\Result.txt"
内容的提问来源于stack exchange,提问作者Aomichi
相关产品推荐
相关产品推荐

