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
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.:
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.
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
Ausgaben:
%Vor%Ich bin jedoch offen für andere Methoden.
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.
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% 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.
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.
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.
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 {}
:
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% 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.
Probieren Sie es mit einem anderen Beispiel aus:
%Vor%Tags und Links powershell-v2.0