PowerShell Aufteilen von Argumenten aus einer JSON

Agt.Romanoff

Lt. Junior Grade
Registriert
Aug. 2011
Beiträge
288
Hallo Community,

nachdem ihr mir, vor allem @sikarr, mit meinem Batch-Datei Problem geholfen habt, brauche ich jetzt Hilfe mit der Powershell.
Nachdem jetzt die Konvertierung funktioniert und eine CSV-Datei entsteht mit Hilfe von:

Code:
$valstring = iwr -Proxy http://Mein-Proxy -ProxyUseDefaultCredentials -Method GET -Uri https://mein-Url -Headers @{'ContentTyp' = 'application/json';"X-Api-Key" = "mein-API-Key"} -UseBasicParsing | Select-Object Content | foreach {$_.Content}

$json = $valstring | ConvertFrom-Json

foreach ($val in $json){
    $val | Export-Csv -Encoding utf8 -Delimiter ';' "json2csvexport.csv" -NoClobber -Append
}

Leider gibt es jetzt in einer Spalte einen Wert der wiederum mehrere Werte enthält. Es gibt also 5 Spalten, wo die einzelnen Werte aus Content stehen und in der sechsten Spalten steht die Überschrift der Spalte und befüllt ist sie mit @{wert 1;wert 2;wert3... . Wie kann ich diese Werte wieder in einzelne Spalten aufteilen?
Ich habe es wie folgt probiert:
Code:
$valstring = iwr -Proxy http://Mein-Proxy -ProxyUseDefaultCredentials -Method GET -Uri https://mein-Url -Headers @{'ContentTyp' = 'application/json';"X-Api-Key" = "mein-API-Key"} -UseBasicParsing | Select-Object Content | foreach {$_.Content} | foreach {Content.metrics}

$json = $valstring | ConvertFrom-Json

foreach ($val in $json){

    $val | Export-Csv -Encoding utf8 -Delimiter ';' "json2csvexport.csv" -NoClobber -Append

}
Leider hat das nicht den gewünschten Erfolg gebracht. Gebt mir mal bitte einen Tipp. Ich vermute eine unter ForEach-Schleife.
Und wie kann ich jetzt nur einzelne Spalten ausgeben lassen. Also zum Beispiel die erste und dritte und die komische sechste Spalte.

Besten Dank
Glühkohle
 
Die Seite hatte ich schonmal vor Augen, wo ich etwas anders machen sollte. Keine Ahnung mehr was es war ;)
Code:
$pathToJsonFile = iwr -Proxy http://Mein-Proxy -ProxyUseDefaultCredentials -Method GET -Uri https://mein-Url -Headers @{'ContentTyp' = 'application/json';"X-Api-Key" = "mein-API-Key"} -UseBasicParsing | Select-Object Content | foreach {$_.Content}
$pathToOutputFile = "json2csvexport.csv"
((Get-Content -Path $pathToJsonFile) | ConvertFrom-Json) | ForEach-Object {
$name = $_.name
$version = $_.version
$classifier = $_.classifier
$uuid = $_.uuid
$metrics = $_.mectrics | ForEach-Object {
    $high = $_.high
    $medium = $_.medium
    $low = $_.low
    $components = $_.components
    }
}
Export-CSV $pathToOutputFile -NoTypeInformation

Ich habe gehofft das so einfach ist, aber leider gibt er mir da nix aus.
Ich weiß aber nicht wo der Denkfehler liegt. Liegt es an dem "-Encoding utf8 -Delimiter ';'" oder was übersehe ich hier?
Ich habe sogar versucht die beiden Codes zu vereinen, aber das hat auch irgendwie nicht funktioniert.

Vielleicht kann mir einer helfen.

Danke.
 
$pathToJsonfile enthält doch keinen Dateipfad, oder? Sondern die Rückgabe aus iwr...
also müsstest du in Zeile 3 folgendes ändern:
$pathToJsonFile | ConvertFrom-Json | Foreach-Object {
Ergänzung ()

Außerdem entspricht es nicht dem Code auf der Seite... da musst du nochmal genauer schauen was dort gemacht wird ;)
(Tipp: er loopt durch die Spalte die eine Liste enthält und erstellt für jeden Eintrag in der Liste eine eigene "Zeile")

Und dein Export-CSV: was soll er denn exportieren? Du übergibst ja nix an das Cmdlet.
 
Zuletzt bearbeitet:
Edit (vorheriger Text komplett gelöscht):
Habe es jetzt mal mit den folgenden Code erstellt:
Code:
$valstring = iwr ...
$valstring = $valstring 
$valstring  = $valstring  -replace "@", ""
$valstring  = $valstring  -replace "=", ":"
$valstring  = $valstring  -replace ";", ","
$valobject = $valstring | ConvertFrom-Json
$valobject | Convertto-Json -depth 100 | Out-File H:\Wichtiges\file.json
$pathToJsonFile = "H:\Wichtiges\file.json"
$pathToOutputFile = "H:\Wichtiges\json2csvexport.csv"
((Get-Content -Path $pathToJsonFile) | ConvertFrom-Json) | ForEach-Object {
        $name = $_.name
        $version = $_.version
        $active = $_.active
$uuid += $_.uuid | ForEach-Object {
    [pscustomobject] @{
        'name' = $name
        'version' = $version
        'active' = $active
#$critical = $metrics.critical
#$high = $mectrics.high
#$medium = $mectrics.medium
        }
    }
}

$uuid | Export-CSV $pathToOutputFile -NoTypeInformation

Die Json-Datei wird dabei richtig erstellt (Zumindestens glaube ich das, da vor der Unterkategorie keine eckige Klammer ist, sondern nur eine geschweifte). Die CSV-Datei sieht eigentlich auch gut aus, aber
1. er schmeißt den ganzen Text in eine Spalte, also name, version und active
2. wenn ich das + bei "$uuid += $_.uuid" weg nehme, dann gibt er mir nur den letzten aus und wenn ich dazu mache, gibt er mir nur das erste aus in der CSV und bringt dann den Fehler
"Fehler beim Aufrufen der Methode, da [System.Management.Automation.PSObject] keine Methode mit dem Namen "op_Addition" enthält".

Sobald das läuft werde ich den Teil mit Json erstellen und json auslesen, wahrscheinlich weg machen.

Vielleicht kann mir jemand eine Anleitung geben, was ich noch falsch mache.

Danke.
 
Zuletzt bearbeitet:
was willst du denn erreichen? Und was soll Zeile 2 sein? :confused_alt: das macht doch so alles keinen Sinn.

Für PS ist es wichtig zu begreifen: das was man auf dem Bildschirm sieht ist nicht, betone IST NICHT!!! das was wirklich da ist. Ja, PS zeigt einem auch schon mal bei der Ausgabe ein @{...} an. Gerade bei eingelesenen Objekten. Aber sobald man sich den Wert der Eigenschaft mal anguckt ( $object.Prop + Enter) sieht man was da wirklich steht.

Irgendwie herumhacken kann man auf dem Code natürlich, aber in 9 von zehn Fällen hat man damit irgendwann (je nach Inhalt der Datei) ein Problem. Nicht ohne Grund ist JSON serialisiertes Objekt, also kann -- soll! man das auch als solches behandeln.
1. Invoke-Webrequest und den JSON-String, der da rauskommt, in Convertfrom-Json stecken und das Ergebnis in eine Variable schreiben.
2. Von hier an ist "JSON" uninteressant. Damit haben wir fertig. Es ist weg. Unsere Quelldaten stecken in Objektform in unserer Variable. Und weil das JSON war, haben wir sehr wahrscheinlich eine Liste von Objekten in der Variable.
3. Von nun an geht es nur noch um das Abbilden des Inhalts der Variable aus Punkt 1 auf eine 2x2 Matrix -- eine Tabelle, die man auch mit Excel abbilden kann --- nichts anderes können wir in CSV stopfen.
4. Daher, sinngemäß:
PowerShell:
foreach($object in $RohdatenAusInvokeWebrequest)
{
$Tabellenzeile = New-object psobject -Property @{
NameDerSpalte_A = ( <#Ausdruck zur Berechnung des Wertes für diese Spalte #> )
NameDerSpalte_B = ( <#ausdruck für diese Spalte #> )
# und so weiter
}
$Tabellenzeile | Export-Csv -Path X -Append #weitere Parameter nach Bedarf
}
und das wars auch schon. Ist keine Raketenwissenschaft.
 
Gebe ich dir recht, die zweite Zeile war quatsch. Keine Ahnung warum ich die habe ich stehen lassen.
Laut deiner Beschreibung sollte es doch so funktionieren:
Code:
$valstring = iwr...
$valobject = $valstring | ConvertFrom-Json
$pathToOutputFile = "H:\Wichtiges\json2csvexport.csv"
foreach ($uuid in $valobject)
{
$DT = New-object psobject -Property @{
name  = $_.name
version = $_.version
active = $_.active
       
    }
$DT | Export-Csv -Path $pathToOutputFile -Append
}

Jetzt macht er die richtige Zeilenanzahl. man erkennt es an den Kommata, die er setzt, aber die Felder bleiben leer. Und es bleibt weiterhin alles nur in der ersten Spalte.

Edit:
Habe dem Spaltennamen auch schon mit Anführungszeichen probiert, aber mit dem gleichen Ergebnis
 

Ähnliche Themen

Zurück
Oben