$labelPrefix = '1.3.6.1.4.1.2620.1.48.29.1.2.' $valuePrefix = '1.3.6.1.4.1.2620.1.48.29.1.3.' $valuePrefix2 = '1.3.6.1.4.1.2620.1.48.29.1.4.' $valuePrefix3 = '1.3.6.1.4.1.2620.1.48.29.1.5.' $snmpTree = '.1.3.6.1.4.1.2620.1.48.29.1' $WalkRequest = @{ UserName = 'SNMPv3Username' Target = 'SecGroupIPAddress' OID = $snmpTree AuthType = 'SHA256' AuthSecret = 'MyAuthSecret' PrivType = 'AES128' PrivSecret = 'MyPrivSecret' } Write-Host "Performing SNMP Query" $s = Invoke-SNMPv3Walk @WalkRequest Write-Host "Filtering Data" filter tableWithPrefix($prefix) { $_ | ? { $_.OID.StartsWith($prefix) } ` | % { $TableIndex = $_.OID.Split('.')[-2]; $_ | Add-Member -NotePropertyName TableIndex -NotePropertyValue ([int]$TableIndex); return $_ } } function indexTableByTableIndex($table) { return $table | Foreach {$indexedTable=@{}} {$indexedTable[$_.TableIndex]= $_} {$indexedTable} } Write-Host "Converting data to table format" $labels = $s | tableWithPrefix($labelPrefix) $values = $s | tableWithPrefix($valuePrefix) $values2 = $s | tableWithPrefix($valuePrefix2) $values3 = $s | tableWithPrefix($valuePrefix3) $indexedValues = indexTableByTableIndex($values) $res = [ordered]@{} $resArr = [System.Collections.ArrayList]@() Write-Host "Building output" foreach ($row in $labels) { # notice that TableIndex goes from 0, but arrays are indexed from 0! # two approaches - depend on array order or index table by TableIndex first #Write-Host $row.OID, $values[$row.TableIndex-1].OID, $indexedValues[$row.TableIndex].OID # values (will work for U) $res[$row.Value] = $values[$row.TableIndex-1].Value #Write-Host $row.Value, $values[$row.TableIndex-1].Value # , $indexedValues[$row.TableIndex].Value $resArr.Add([PSCustomObject]@{Name=$row.Value; Value1=$values[$row.TableIndex-1].Value; Value2=$values2[$row.TableIndex-1].Value; Value3=$values3[$row.TableIndex-1].Value}) | Out-Null } Write-Host "Done" $res = [PSCustomObject]$res # $res | ConvertTo-Json | out-file formartin.json Write-Host "Formatting Results table:" $resArr | ft