2012-12-23 14 views
17

Kann jemand die Details erklären? Wenn ich ein Objekt mitUnterschied zwischen PSObject, Hashtable und PSCustomObject

$var = [PSObject]@{a=1;b=2;c=3} 

erstellen und dann suche ich nach seiner Art mit getType() Powershell sagt mir seine vom Typ Hashtable. Wenn gm verwendet wird, um das Objekt zu untersuchen, ist es offensichtlich, dass eine Hashtabelle erstellt wurde, da es eine Schlüssel- und eine Werteeigenschaft hat. Was ist der Unterschied zu einer "normalen" Hashtabelle?

Auch, was ist der Vorteil der Verwendung eines PSCustomObject? Wenn man so etwas wie dieses

$var = [PSCustomObject]@{a=1;b=2;c=3} 

die einzige sichtbare Unterschied für mich mit der Erstellung der verschiedenen Datentypen von PSCustomObject. Anstelle von Schlüsseln und Werteigenschaften zeigt eine Inspektion mit gm, dass nun jeder Schlüssel als ein NoteProperty-Objekt hinzugefügt wurde. Aber welche Vorteile habe ich? Ich kann mit den Schlüsseln auf meine Werte zugreifen, genau wie in der Hashtabelle. Ich kann mehr als einfache Schlüssel-Wert-Paare (Schlüssel-Objekt-Paare zum Beispiel) im PSCustomObject, JUST wie in der Hashtabelle speichern. Also, was ist der Vorteil? Gibt es wichtige Unterschiede?

Antwort

1

Ich denke, der größte Unterschied, den Sie sehen werden, ist die Leistung. Werfen Sie einen Blick auf diesen Blog-Post:

http://powertoe.wordpress.com/2011/03/31/combining-objects-efficiently-use-a-hash-table-to-index-a-collection-of-objects/

Hier sind einige der anderen, subtilen Vorteile: http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/04/13/Custom-objects-default-display-in-PowerShell-3-0.aspx

+1

Well , Leistung - okay. Aber ist das alles? Auch die Leistung ist pro Hashtable. Was gibt es also für das PSCustomObject? Und die Standard-Anzeigeoption, wirklich? Gemeinsam haben wir es mit Daten zu tun - niemand will das Zeug jeden Tag anzeigen. Und manchmal, wenn ich Daten anzeigen muss, kann ich immer noch eine kleine Schleife erstellen und Standardformatierer verwenden. Scheint nicht ausreichend um einen neuen Datentyp für mich zu rechtfertigen. – masi

+2

Der Artikel im ersten Link sagt nichts über die Geschwindigkeit von psobject vs pscustomobject. Stattdessen hebt es den Unterschied zwischen einem O (m * n) - und einem O (m * lnn) -Algorithmus hervor. – JJJ

+4

"Zitieren Sie immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder dauerhaft offline geschaltet wird." - http://stackoverflow.com/help/how-to-answer – Pete

10

Ein Vorteil, den ich für psobject denken ist, dass Sie benutzerdefinierte Methoden mit ihm zu schaffen. Zum Beispiel

$o=New-Object PSObject -Property @{ 
    "value"=9 
} 
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value { 
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))" 
} -inputObject $o 

$o.Sqrt() 

Sie dies die Sortierreihenfolge der psobject Eigenschaften steuern können (siehe PSObject sorting)

+0

Beachten Sie, dass Sie dies mit einem PSObject oder PSCustomObject tun können. –

20

Ein Szenario, in dem [PSCustomObject] statt HashTable verwendet wird, ist, wenn Sie eine Sammlung von ihnen benötigen. Im Folgenden ist der Unterschied in zeigen, wie sie behandelt werden:

$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 

$Hash | Format-Table -AutoSize 
$Custom | Format-Table -AutoSize 

$Hash | Export-Csv .\Hash.csv -NoTypeInformation 
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformation 

Format-Table im folgenden für $Hash führen:

Name Value 
---- ----- 
Name Object 1 
Squared 1 
Index 1 
Name Object 2 
Squared 4 
Index 2 
Name Object 3 
Squared 9 
... 

und folgende für $CustomObject:

Name  Index Squared 
----  ----- ------- 
Object 1  1  1 
Object 2  2  4 
Object 3  3  9 
Object 4  4  16 
Object 5  5  25 
... 

Same Sache passieren mit Export-Csv, also der Grund, [PSCustomObject] statt nurzu verwenden

13

Angenommen, ich möchte einen Ordner erstellen.Wenn ich einen PSObject verwenden kann Ihnen sagen, es von es bei der Suche

PS > [PSObject] @{Path='foo'; Type='directory'} 

Name       Value 
----       ----- 
Path       foo 
Type       directory 

falsch ist jedoch die PSCustomObject korrekt aussieht

PS > [PSCustomObject] @{Path='foo'; Type='directory'} 

Path         Type 
----         ---- 
foo          directory 

Ich kann dann Rohr das Objekt

[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item 
+0

Bis abstimmen, weil das genau die Antwort war, nach der ich gesucht habe. –