Az 1.9.5 Egyedi objektumok létrehozása fejezetben szó volt arról, hogy a New-Object cmdlet segítségével létre tudunk hozni PSobject alapon tetszőleges egyedi objektumot. Ahhoz, hogy ezekhez saját format.ps1xml állományokat rendeljünk az szükséges, hogy a PSObject-hez képest egyedi nevet adjunk a típusuknak. Erre már láttunk példát az e-mail adattípusnál az 1.9.6 Új típusok létrehozása (Add-Type) fejezetben, de ott C# alapon hoztunk létre teljesen egyedi típust. Ez nem annyira kényelmes, mert nem biztos, hogy mindenki ismeri a C# szintaktikáját (például én sem), így valami más megoldást kell találnunk.
Ugyan a GetType() metódussal lekérhető „igazi” típusa az objektumoknak nem írható át, de a PSObject.TypeNames tulajdonság már átírható és szerencsére a PowerShell a formátum meghatározásánál ezt veszi figyelembe. Nézzünk erre egy példát, létrehozok egy $o egyedi objektumot PSObject típusra alapozottan:
[22] PS C:\> $o = New-Object -TypeName PSObject -Property @{Első = "eleje";Máso
dik= "Vége"}
[23] PS C:\> $o
Második Első
------- ----
Vége eleje
A kimeneten látjuk, hogy az alaphelyzet szerinti formázási szabály lépett életbe, azaz miután 5-nél kevesebb a tulajdonság, ezért táblázatos a nézet, és az oszlopok egyenletesen vannak elosztva.
Nézzük, hogy mi van ennek az objektumnak a PSObject.TypeNames tulajdonságában:
[24] PS C:\> $o.psobject.typenames
System.Management.Automation.PSCustomObject
System.Object
Látható, hogy a PSObject.TypeNames tulajdonság egy tömb, ami az öröklődési lánc összes tagját tartalmazza az adott objektumra vonatkozóan. Ugyan ez a tulajdonság csak olvasható, viszont van egy Insert metódusa, mellyel hozzá lehet adni egyedi típusnevet is, a 0 első paraméterrel ez a lista elejére fog kerülni:
[25] PS C:\> $o.psobject.TypeNames.Insert(0,"mytype")
Ha ezek után én létrehozok ehhez a „mytype” adattípushoz egy formázó PS1XML fájlt, amelyben például átnevezem az oszlopfejléc címkéit és oszlopszélességeket állítok be és importálom:
[26] PS C:\> $formatxml = '<?xml version="1.0" encoding="Unicode" ?>
>> <Configuration>
>> <ViewDefinitions>
>> <View>
>> <Name>mytype</Name>
>> <ViewSelectedBy>
>> <TypeName>mytype</TypeName>
>> </ViewSelectedBy>
>> <TableControl>
>> <TableHeaders>
>> <TableColumnHeader>
>> <Label>Első col</Label>
>> <Width>8</Width>
>> </TableColumnHeader>
>> <TableColumnHeader>
>> <Label>Második col</Label>
>> <Width>11</Width>
>> </TableColumnHeader>
>> </TableHeaders>
>> <TableRowEntries>
>> <TableRowEntry>
>> <TableColumnItems>
>> <TableColumnItem>
>> <PropertyName>Első</PropertyName>
>> </TableColumnItem>
>> <TableColumnItem>
>> <PropertyName>Második</PropertyName>
>> </TableColumnItem>
>> </TableColumnItems>
>> </TableRowEntry>
>> </TableRowEntries>
>> </TableControl>
>> </View>
>> </ViewDefinitions>
>> </Configuration>
>> '
>>
[27] PS C:\> Set-Content -Path $env:temp\mytype.format.ps1xml -Value $formatxml
[28] PS C:\> Update-FormatData -AppendPath $env:temp\mytype.format.ps1xml
Ezután már ennek megfelelően fog megjelenni a kimeneten az egyedi objektumom, annak ellenére, hogy ő valójában továbbra is egy [PSObject] típus:
[29] PS C:\> $o
Első col Második col
-------- -----------
eleje Vége
Ez a trükk nagyon jól jön nekünk főleg akkor, ha sok tulajdonsággal rendelkező PSObject-et készítünk, de valójában nem az összest, csak mindig ugyanazt az 5-6 tulajdonságot szeretnénk táblázatosan megjeleníteni, ráadásul normális oszlopszélességekkel. Ehhez az kellene, hogy mindig egy ilyen bonyolult kifejezéssel éljünk:
$egyedi | Format-Table -Property @{n="első"; w=8; e={$_.első}}, @{n="második";w=11 ;e={$_.második}}, @{n="harmadik"; w= 15; e={$_.harmadik}}...
Mennyivel egyszerűbb egyszer létrehozni a formázó XML fájlt és importálni, és az objektum létrehozásakor csak hozzá kell adni az egyedi típusnevet a PSObject.TypeNames tulajdonsághoz.
Megjegyzés
A $o.PSObject.TypeNames helyett egyszerűbben a PSTypeNames tulajdonságon keresztül is lekérhetjük a típusneveket:
PS C:\> $o.PSTypeNames
System.Management.Automation.PSCustomObject
System.Object