Egyedi típusok elnevezése

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



Word To HTML Converter