2016-06-18 34 views
2

Ich habe eine Frage rund um die Verarbeitung einiger Daten, die ich von VMWARE vROPS 6.X ziehen.Doppel-For-Schleife um Daten zu verarbeiten?

Grundsätzlich habe ich ein Skript geschrieben, um metrische Daten aus der Suite API zu ziehen. Ich habe fast das Format, das ich will, aber ich muss die Metric und Timestamp Spalte einen Schritt weiter teilen.

Grundsätzlich baute ich eine foreach Schleife und dann verschachtelte eine andere innerhalb, aber ich bekam nicht die Metriken und Zeitstempel in der richtigen Reihenfolge (so habe ich es aus dem Code entfernt).

Stromausgang:

"resourceId","Timestamp","METRIC","value" 
"ef951a38-3063-477d-af32-baa6d2744357","1466085599999 1466171999999","cpu:1|costop_summation","4.6296298710836307E-4 0.0 4.5836298710836307E-4 0.0" 
"ef951a38-3063-477d-af32-baa6d2744357","1466085599999 1466171999999","mem|usage_average","12.678446789582571 15.390000343322754"

gewünschte Ausgabe:

"resourceId","Timestamp","METRIC","value" 
"ef951a38-3063-477d-af32-baa6d2744357","1466085599999","cpu:1|costop_summation","4.6296298710836307E-4 0.0" 
"ef951a38-3063-477d-af32-baa6d2744357","1466171999999","cpu:1|costop_summation","4.5836298710836307E-4 0.0" 
"ef951a38-3063-477d-af32-baa6d2744357","1466085599999","mem|usage_average","12.678446789582571" 
"ef951a38-3063-477d-af32-baa6d2744357","1466171999999","mem|usage_average","15.390000343322754"

Mein Code:

#Call vROPS SUITE-API with Invoke-Rest 

#Take all certs. 
Add-Type @" 
using System.Net; 
using System.Security.Cryptography.X509Certificates; 
public class TrustAllCertsPolicy : ICertificatePolicy { 
    public bool CheckValidationResult(
     ServicePoint srvPoint, X509Certificate certificate, 
     WebRequest request, int certificateProblem) { 
     return true; 
    } 
} 
"@ 
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy 

#date 
[DateTime]$StartDate = (Get-date).adddays(-5) 
[DateTime]$EndDate = (Get-date) 

$StartDateEpoc = Get-Date -Date $StartDate -UFormat %s 
$EndDateEpoc = Get-Date -Date $EndDate -UFormat %s 

#Variables 
$username = "admin" 
$password = "password" 
$secPw = ConvertTo-SecureString $password -AsPlainText -Force 
$cred = New-Object PSCredential -ArgumentList $username,$secPw 
$ContentType = "application/xml;charset=utf-8" 
$header = New-Object "System.Collections.Generic.Dictionary[[String,[String]]" 
$header.Add("Accept", 'application/xml') 

#intervalType= 
$SECONDS = 'SECONDS' 
$MINUTES = 'MINUTES' 
$HOURS = 'HOURS' 
$DAYS = 'DAYS' 

#rollUpType= 
$AVG = 'AVG' 
$MAX = 'MAX' 
$SUM = 'SUM' 
$MIN = 'MIN' 
$COUNT = 'COUNT' 

Invoke-RestMethod -Method GET -uri "https://192.168.0.125/suite-api/api/resources/stats?resourceId=ef951a38-3063-477d-af32-baa6d2744357&resourceId=1ef459e5-789e-446b-9852-3dc92c43e74a&statKey=cpu|usage_average&rollUpType=$AVG&intervalType=$DAYS" -Credential $cred -ContentType $ContentType -Headers $header -OutFile  d:\quickcheck.xml 

[xml]$Data = Get-Content 'D:\quickcheck.XML' 

$report = @() 

$resources = $Data.'stats-of-resources' 
$UUIDS = $Resource.'resourceId' 

foreach ($Resource in $Resources.'stats-of-resource') { 
    foreach ($node in $Resource.'stat-list'.stat) 
    { 
    #Collection Date, not run time 
    $MetricName = $node.statKey.Key 

    $Values  = @($node.data -replace '(\d\.\d) ',"`$1`n" -split "`n") 
    $Timestamps = @($node.timestamps -split ' ') 
     for ($i=0; $i -lt $Values.Count -and $i -lt $Timestamps.Count; $i++) { 
     $report += New-Object PSObject -Property @{ 
      METRIC  = $MetricName 
      resourceId = $Resource.'resourceId' 
      Timestamp = $Timestamps[$i] 
      value  = $Values[$i] 
    } 
} 

    } 

$report | Export-Csv D:\reprop.csv -NoTypeInformation 

Antwort

0

Split $Timestamps an Räumen und $Values bei jedem zweiten Raum, und erstellen Sie ein Objekt für jedes resultierende Paar von Fragmenten, z wie folgt:

$Values  = @($Values -split ' ') 
$Timestamps = @($Timestamps -split ' ') 
for ($i=0; $i -lt $Values.Count -and $i -lt $Timestamps.Count; $i++) { 
    $report += New-Object PSObject -Property @{ 
    METRIC  = $MetricName 
    resourceId = $Resource.'resourceId' 
    Timestamp = $Timestamps[$i] 
    value  = $Values[$i] 
    } 
} 
+0

danke für die antwort, meinst du so? – Humpadilly

+0

danke für die Antwort, es entfernt einen der 2 Timestamp Werte und ich am Ende noch mit 2 Werten und keine zusätzlichen Zeilen. Unten ist die neue Ausgabe. "resourceId", "Timestamp", "Metric", "Wert" "ef951a38-3063-477d-AF32-baa6d2744357", "1466258399999", "CPU | usage_average", "1,9282337965236769 1,9452419329074122" „1ef459e5-789e- 446b-9852-3dc92c43e74a "," 1466258399999 "," cpu | usage_average "," 2.8392222217387624 3.6437365691508017 " – Humpadilly

+0

@Humpadilly Der Code ist * nicht * soll * innerhalb * der verschachtelten' foreach'-Schleife gehen. Enthält '$ Values' auch 2 oder 4 Zahlen? Und wie willst du sie teilen? –