Wie initialisieren Sie ein array von benutzerdefinierten Objekten
Erste, dies führt zu meiner Frage, werde ich beginnen mit der Feststellung, dass ich schon mit XML gearbeitet ein gutes Stück in PowerShell, und wie lese ich Daten aus XML-Dateien, schnell, in arrays von benutzerdefinierten Objekten. Zum Beispiel, wenn ich das folgende XML-Datei:
<stuff>
<item name="Joe" age="32">
<info>something about him</info>
</item>
<item name="Sue" age="29">
<info>something about her</info>
</item>
<item name="Cat" age="12">
<info>something else</info>
</item>
</stuff>
Und wenn ich lese es einfach, wie diese:
[xml]$myxml = Get-Content .\my.xml
Dann kann ich mich zu einer Reihe von meine Artikel wie dieser:
[array]$myitems = $myxml.stuff.Item
$myitems
name age info
---- --- ----
Joe 32 something about him
Sue 29 something about her
Cat 12 something else
So, nun meine Frage:
Wie kann ich erstellen Sie eine ähnliche Struktur ein array mit benutzerdefinierten Objekten, und initialisieren Sie in meinem Skript, ohne einer Datei zu Lesen?
Ich kann viel looping und/oder Menge der Erzeugung/Initialisierung der einzelnen Objekte, und fügen Sie in ein array ein zu einer Zeit...
Aber es scheint, es sollte eine Möglichkeit zum ausführen dieser Erstellung/Initialisierung in einem einfacheren Weg. Beachten Sie, dass der Schlüssel hier ist, dass meine benutzerdefinierte Objekte haben mehr als zwei Elementen (sonst würd ich verwendet habe, hash).
Habe ich auch sah die Schaffung eines großen XML-Zeichenfolge, und mithilfe von Select-XML, aber ich konnte einfach nicht bekommen die syntax richtig (wenn das überhaupt die richtige Straße hinunter).
- Also ich denke, was Sie Fragen ist, wie können Sie ein array von Objekten, die Sie on the fly erstellt, und zeigt Sie in ordentlichen Tabellen, wie Sie es mit der xml oben?
- Es ist schade, dass sich zu den Anforderungen gehören nicht Lesen aus einer Datei. Import-Csv ergibt ein array von pscustom Objekte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich tun würde etwas in dieser Richtung:
Beachten Sie, dass dies nur in PowerShell 3, aber da Sie nicht zu erwähnen, die version, die in Ihrer Frage gehe ich davon spielt das keine Rolle für Sie.
Update
Es wurde erwähnt in den Kommentaren, wenn Sie das folgende tun:
Wirst du nicht bekommen
1
als Sie vielleicht erwarten. Dies geschieht, wenn eine einzigepscustomobject
zurückgegeben. Nun ist dies nicht ein problem für die meisten anderen Objekte in PowerShell, weil Sie Surrogat-Eigenschaften fürLength
undCount
. Leiderpscustomobject
nicht. Dieser ist fest in der PowerShell 6.1.0. Sie können umgehen dies, indem Sie Betreiber@()
:Für mehr hintergrund siehe hier und hier.
Update 2
In PowerShell 5 kann man Klassen zu erreichen, eine ähnliche Funktionalität. Zum Beispiel können Sie eine Klasse definieren, wie hier:
Backticks sind hier so, dass Sie kopieren könnte und fügen Sie ihn in die Befehlszeile, Sie sind nicht verpflichtet, in einem Skript. Nachdem die Klasse definiert ist, können Sie die ein array erstellen, die den üblichen Weg:
Beachten Sie, dass dieser Weg nicht der Nachteil bereits im vorherigen update, auch in der PowerShell 5.
Update 3
Können Sie auch intialize ein Klasse-Objekt mit einer hashtable, ähnlich dem ersten Beispiel. Für die, die Sie benötigen, um sicherzustellen, dass ein default contructor definiert. Wenn Sie keine Konstruktoren, einen für Sie erstellt wird, aber wenn Sie eine non-default, default-Konstruktor wird nicht da sein, und Sie brauchen, um zu definieren es ausdrücklich. Hier ist ein Beispiel mit dem Standard-Konstruktor, der automatisch erstellt:
Können Sie:
Dies ist ein wenig Ausführlicher, aber auch etwas expliziter. Dank @js2010 für den Hinweis.
Error: Cannot convert value to type "...InternalPSCustomObject". Only core types are supported in this language mode.
ich nicht sehen, diese auf meinen anderen Maschinen, so dass es vielleicht nicht verwandt, aber einigen anderen config-Problem? (es wird PS 3.0 - aber es ist ein ARM-Prozessor mit Windows 8 -- ok, es ist ein Surface RT).Hier ist eine prägnante Art und Weise zu initialisieren Sie ein array von benutzerdefinierten Objekte in der PowerShell.
New-Object PsObject -Property @{ Prop1 = "1"; Prop2 = "2"; etc... }
zu[PsObject]@{ Prop1 = "1"; Prop2 = "2"; etc... }
Dank! 🙂Vielleicht meinst du so? Ich mag, um ein Objekt und verwenden Sie Format-Table:
Dies wird alle Objekte, die Sie in dem array in den Spalten entsprechend Ihrer Eigenschaften.
Tipp: Mit
-auto
Größen der Tabelle besserKönnen Sie auch angeben, welche Eigenschaften in der Tabelle. Nur trennen Sie die einzelnen Namen der Eigenschaft mit einem Komma:
Der einfachste Weg, um ein array zu initialisieren
"Array erstellen"
Erstellen Sie Ihre Kopfzeile
Füllen Sie die Zeile
Zeile hinzufügen, um $array
Ergebnis
Hier ist eine Kurzfassung der akzeptierten Antworten vermeidet die Wiederholung der NoteProperty-IDS und die
[pscustomobject]
-Darsteller:Ergebnis:
$myItems = , ("Sue",29,"something about her") | ...
.Verwenden Sie ein "Hier-String" und " cast to XML.
Angesichts der oben angeführten Daten, dies ist, wie ich es tun würde:
Den code unten funktioniert auch wenn man nur 1 Element nach einem
Where-Object
:Ergebnis:
PSCustomObject
nicht surropgate Eigenschaften fürCount
undLength
wie beschrieben, hier und hier. Sie sind mit hashtable anstelle von dem, was gefragt wurde im Frage, also side-stepping dieses Problem. Leider hashtable-Nutzung ist nicht immer wünschenswert.If you want to test it with PSCustomObject it will still work as desired.
. Nein das tut es nicht, weil es nicht, wie ich oben erklärt. Testen Sie es selbst und sehen. Ich habe.PSObject
, wird es nicht funktionieren. Warum würden Sie verwendenPSCustomObject
wenn Sie verwenden könnenPSObject
dann? Außerdem, warum würde der Where-Object Verhalten sich wie Select-Object in diesem Szenario? Wo ist nicht eine Suche-Funktion, es ist immer eine Sammlung Filtervorgang.Musste ich ein array erstellen eines vordefinierten Typs, und ich erfolgreich war wie folgt:
Einer kleinen Abweichung, die auf Klassen. Initialisieren Sie es mit hashtables.