Bizonyos esetekben szükség lehet, hogy teljesen új típust hozzunk létre. Egyszerűbb esetben elég, ha ez nem is „igazi” új típus, hanem a [PSObject] típus egy példányának egy nekünk tetsző tulajdonságokkal kiegészített változata. Ezt a korábban látott Add-Member cmdlettel is megtehetjük, vagy a PowerShell 2.0 új lehetőségével, amikor a New-Object cmdlet –Property paraméterének adunk át egy olyan hashtáblát, amelyben a tulajdonságnév-érték párok vannak, mint ahogy a következő példa mutatja:
$p = @{
név = "Soós Tibor"
életkor = 39
felvét = (get-date)
}
$user = New-Object -TypeName PSObject -Property $p
Nézzük, hogy mi lett ennek az eredménye:
[76] PS C:\munka> $user
életkor név felvét
------- --- ------
39 Soós Tibor 2010. 01. 10. 23:13:07
[77] PS C:\munka> $user | gm
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
felvét NoteProperty System.DateTime felvét=2010. 01. 10. 23:13:07
név NoteProperty System.String név=Soós Tibor
életkor NoteProperty System.Int32 életkor=39
Látható, hogy bár az általam megadott objektumtípus PSObject volt, de ezzel a paraméterezéssel a new-object PSCustomObject típussá alakította ezt, és ehhez NoteProperty típusú tagjellemzőket vett fel.
PowerShell 3.0-tól kezdődően ráadásul használhatjuk a sorrendtartó szótártípust is, így az egyedi objektumok tulajdonságai ugyanabban a sorrendben jelennek meg, ahogy felsoroltuk azokat:
PS C:\> new-object -TypeName PSObject -Property ([ordered] @{név = "Soós Tibor"
; életkor = 44; felvét = (get-date)})
név életkor felvét
--- ------- ------
Soós Tibor 44 2014.08.30. 17:21:29
Sőt! Még egyszerűbb módszer is van ugyanerre:
PS C:\> [pscustomobject] @{név = "Soós Tibor"; életkor = 44; felvét = (get-dat
e)}
név életkor felvét
--- ------- ------
Soós Tibor 44 2014.10.02. 23:06:32
Sőt! Rögtön hozzárendelhetünk ehhez az egyedi objektumhoz egy egyedi típust is:
PS C:\> $o = [pscustomobject] @{név = "Soós Tibor"; életkor = 44; felvét = (ge
t-date); PSTypeName = "MyCustomType.Person"}
PS C:\> $o.pstypenames
MyCustomType.Person
System.Management.Automation.PSCustomObject
System.Object
Azaz a PSTypeName tulajdonságnak megadott név lesz az egyedi objektumunk elsődleges típusneve, így majd ehhez rendelhetünk formázó kifejezéseket (lásd a 1.9.8 Formázás testre szabása (Get‑FormatData, Update-FormatData) fejezetet).
A pscustomobject új „típusgyorsítóval” három előnyhöz is jutunk: egyrészt ez alaphelyzetben „ordered”, azaz abban a sorrendben jeleníti meg a tulajdonságokat, ahogyan azokat definiáljuk, másrészt rögtön egyedi típust is definiálhatunk, harmadrészt nagyon gyors! Az egyedi objektumok létrehozásának módszerei közül ez a leggyorsabb.