Powershell在arraylist中查找值

Powershell在arraylist中查找值,powershell,arraylist,find,Powershell,Arraylist,Find,我希望你能帮助我。我使用两个ArrayList: array1中填充了log.csv(包含标题和登录数据,“pc”列的值是唯一的)。它被定义为ArrayList,因为我想添加条目 #pc,name,date,city #pc-x,name-1,2017-01-01,berlin #pc-y,name-1,2017-01-02,berlin #pc-z,name-2,2017-01-02,munich [System.Collections.ArrayList]$array1 = Import-C

我希望你能帮助我。我使用两个ArrayList:

array1中填充了log.csv(包含标题和登录数据,“pc”列的值是唯一的)。它被定义为ArrayList,因为我想添加条目

#pc,name,date,city
#pc-x,name-1,2017-01-01,berlin
#pc-y,name-1,2017-01-02,berlin
#pc-z,name-2,2017-01-02,munich
[System.Collections.ArrayList]$array1 = Import-Csv log.csv
array2在运行时填充

$array2=[System.Collections.ArrayList]@()
... ForEach-Object {
$array2.Add([PSCustomObject]@{ pc=$pcname
                               name=$loginname
                               date=$logindate }) >$null }
我想做的是: 更新array1.date=array2.date,其中array1.pc=array2.pc

如果在array1中找不到条目,我想添加它:

 $array1.Add([PSCustomObject]@{ pc=$pcname
                                name=$loginname
                                date=$logindate 
                                city='[unknown]' }) >$null
最后再次导出array1:

$array1 | Export-Csv log.csv -Encoding UTF8 -NoTypeInformation

所以问题是:如何在array1中找到条目并更新它?已经努力了好几天了……

这是我创建的一个示例,可能会有所帮助。注意:我使用列表类型而不是ArrayList类型。此外,它假定要更新的数据中只有一个可能匹配的PC名称。您必须修改它来更新文件,因为它只更新第一个列表变量。让我知道进展如何

[PSCustomObject]
{
[string] $pc,
[string] $name,
[string] $date,
[string] $city
}

[System.Collections.Generic.List[PSCustomObject]] $list1 = Import-Csv "C:\SOSamples\log.csv";
[System.Collections.Generic.List[PSCustomObject]] $list2 = Import-Csv "C:\SOSamples\log2.csv";
[PSCustomObject] $record = $null;
[PSCustomObject] $match = $null;

foreach($record in $list2)
{
    # NOTE: This only retrieves the FIRST MATCHING item using a CASE-INSENSITIVE comparison       
    $match = $list1 | Where { $_.pc.ToLower() -eq $record.pc.ToLower() } | Select -First 1;

    if($match -eq $null)
    {
        Write-Host "Not Found!";
        $list1.Add($record);
    }
    else 
    {
        Write-Host "Found!";
        $match.date = $record.date;
    }
}

Write-Host "--------------------------------------------------------------------"

foreach($record in $list1)
{
    Write-Host $record
}

试着这样做:

$array1=import-csv "C:\temp\log.csv"
$array2=import-csv "C:\temp\log2.csv"

#modify founded and output not founded
$toadd=$array2 | %{
$current=$_
$founded=$array1 | where pc -eq $current.pc | %{$_.date=$current.date;$_}

    if ($founded -eq $null)
    {
      $current.city='UNKNOW' 
      $current 
    }
}

#output of $array1 modified and elements to add
$array1, $toadd

有一篇很好的文章说,你应该首先展平你的数组,然后你可以使用迭代来检查元素。我问自己,为什么Join对象不是PowerShell的本机命令……将“$match.date=$record.date”也更新“$list1”?它应该更新,但像我差不多一周前做的那样进行验证。;-)你能解释一下“%$U.date=$current.date;$U}”中“%$U”之后的“%$U”吗?它是用来将当前项输出的