Algo como isso deve funcionar:
$result = @()
Function getIndex($location)
{
for($j = 0; $j -lt $result.Count; $j++) {
if($result[$j].Location -contains "$location") {
$index=$j
break;
}
}
return $index
}
for ($i=0; $i -lt $outarray.length; $i++) {
$loc=$outarray[$i].Location
$aphones=$outarray[$i].'Analog Phones'
$ipphones=$outarray[$i].'IP Phones'
if(!($result | where-object {$_.Location -eq "$loc"})) {
$result+=New-object psobject -property @{'Location' = "$loc"; 'Analog Phones' = $aphones; 'IP Phones' = $ipphones}
} else {
$index=getIndex($loc)
$result[$index].'Analog Phones' = $result[$index].'Analog Phones' + $aphones
$result[$index].'IP Phones' = $result[$index].'IP Phones' + $ipphones
}
}
$result
$result
output é:
Analog Phones IP Phones Location
------------- --------- --------
413 887 Site1
192 333 Site2
Aqui está a lógica:
Define an empty $result array to store final results
Iterate over $outarray
each time a location is found
if location does not exists in $result then
add full line from $outarray into $result for this location
if location already exists in $result then
retrieve the index for the given location in $result
update Analog Phones number in $result with values from $outarray + $result for the given location (index)
update IP Phones number in $result with values from $outarray + $result for the given location (index)
PS: Eu não sou um Powershell Guru, então eu acho que o getIndex
poderia ser melhorado. No entanto, funcionou para mim com base no seu código-fonte.
Espero que ajude!
EDITAR
Aqui está a maneira como integrei meu código ao seu:
Primeiro eu criei o $outarray
como você (eu acho), exceto que eu usei valores codificados (não analisando um arquivo xml):
$outarray = @()
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 883;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 413;'IP Phones' = 0;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 4;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 258;'Location' = "Site2"}
$outarray+=New-object psobject -property @{'Analog Phones' = 9;'IP Phones' = 75;'Location' = "Site2"}
$outarray+=New-object psobject -property @{'Analog Phones' = 183;'IP Phones' = 0;'Location' = "Site2"}
A partir desse ponto, meu $outarray
é assim:
Analog Phones IP Phones Location
------------- --------- --------
0 883 Site1
413 0 Site1
0 4 Site1
0 258 Site2
9 75 Site2
183 0 Site2
Em seguida, adicionei meu código logo após o comando export-csv
:
$outarray | Sort-Object............
MY CODE HERE
EDIT 2
Encontrei um problema com seu código real: os números são interpretados como sequências de caracteres para que não possam ser calculados corretamente. Você tem que convertê-los em números inteiros:
foreach($item in $finalxml){
...
...
$outarray+=New-object psobject -property @{
'Analog Phones' = [int]$item.analog_phones
'IP Phones' = [int]$item.ip_phones
'Location' = $location
}
}