Powershell在arraylist中查找值
我希望你能帮助我。我使用两个ArrayList: array1中填充了log.csv(包含标题和登录数据,“pc”列的值是唯一的)。它被定义为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
#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”吗?它是用来将当前项输出的