Iterating durch Schlüsselnamen von einem PSCustomObject

8

Ich schreibe ein Skript für meine Site, das eine JSON-Konfigurationsdatei verwendet. Der JSON ähnelt dem folgenden:

%Vor%

Um das Objekt in etwas zu konvertieren, das PowerShell lesen kann, verwende ich ConvertFrom-Json , das es in PSCustomObject

konvertiert

Ich bin an einem Punkt, wo ich über die Groups iterieren muss und jeden Gruppennamen erhalten muss, um sie und ihren entsprechenden Index innerhalb des Groups -Objekts der Konfiguration auszugeben. I. E.:

%Vor%

Am weitesten habe ich:

%Vor%

und all dies gibt etwas aus, das wie eine PS-Array-Notation aussieht:

@{GroupOne=; GroupTwo=; GroupThree=;}

Ist das sogar mit einem PSCustomObject -Typ möglich? Ich code hauptsächlich in JavaScript, also bin ich vielleicht zu einfach (oder überkomplizierend), da dies relativ einfach wäre.

    
SomeShinyObject 13.09.2013, 06:37
quelle

2 Antworten

8

Ich glaube, ich habe es gerade dank der folgenden Seite herausgefunden:

Ссылка

Wenn Sie Get-Member und dann -MemberType verwenden, wird jede Gruppe sichtbar und dann ziehen Sie einfach das

%Vor%

Ausgaben:

%Vor%

Ich bin jedoch offen für andere Methoden.

Aktualisieren

Also habe ich einen anderen Weg gefunden, aber der einzige Nachteil ist, dass es nicht die fancy ConvertFrom-Json CmdLet benutzt. Stattdessen geht es direkt in die .NET-Bibliothek und verwendet seinen Deserializer und konvertiert es in eine HashTable. Mit dieser Komplettierung wird vermieden, dass Sie sich mit dem PSCustomObject herumschlagen müssen. IMO Hashtables sind viel einfacher zu arbeiten.

%Vor%     
SomeShinyObject 13.09.2013, 06:51
quelle
8

Update (2018 Mär 09)

Ich bin nicht sicher, wie früh eine Version das machen kann, aber es funktioniert für mich in PowerShell 5.1 ... zögern Sie nicht, es in früheren Versionen zu versuchen:

%Vor%

Ausgaben

%Vor%

Dies ist alles mit POSH 4.0 getan; ConvertTo-Json und ConvertFrom-Json wurden in POSH 3.0 eingeführt. Ich habe POSH 3.0 oder 5.0 nicht getestet.

Lösung

%Vor%

Hinweis: Dies setzt voraus, dass alle Elemente, die Sie durchlaufen möchten, vom Typ NoteProperty sind. Sie sollten sich .PSObject.Members Ihres Objekts ansehen und sicherstellen, dass Sie ( Where{} ; shorthand: ?{} ) korrekt auf Ihrem Objekt filtern.

Ausgaben

%Vor%

Voila! Jetzt haben wir eine Wiederholung! Ich weiß, dass es nicht hübsch und glatt ist, als ob man durch eine Hashtable iteriert, aber es wird jetzt zumindest iteriert.

Erläuterung

Die ursprüngliche JSON-Einreichung des OP wurde nicht über ConvertFrom-Json analysiert; hat den folgenden Fehler ausgegeben: ConvertFrom-Json : Invalid JSON primitive . Also habe ich stattdessen den folgenden JSON verwendet; Gleiche, in geschweifte Klammern eingeschlossen {} :

%Vor%

Die von @ChristopherW gelieferte Lösung funktionierte nicht für mich. Es erstellt zwar ein Array von Namen, aber ich musste das Objekt durchlaufen. Wenn wir die ursprünglich gepostete Lösung ein wenig modifizieren, können wir sehen, dass es keine Iteration gibt:

%Vor%

Tatsächliche Ausgabe

%Vor%

Denken Sie daran, dass die Reihenfolge in einem benannten Array / hashtable / dictionary / pscustomobject nicht relevant und nicht garantiert ist. Wir wissen, dass es keine Iteration gibt, weil -- nur einmal ausgegeben wird.

Ein anderes Beispiel

Probieren Sie es mit einem anderen Beispiel aus:

%Vor%

Ausgaben

%Vor%     
VertigoRay 18.11.2015 22:55
quelle

Tags und Links