You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:01:23