Formázás testre szabása (Get‑FormatData,  Update-FormatData)

A PowerShell parancsainak, kifejezéseinek és csővezetékeinek a kimenetét valójában az Out‑Default  cmdletnek köszönhetjük, amelyet a parancsértelmező a háttérben hozzábiggyeszt a kimenetet adó kifejezések végére. Ha a kimenet egyszerű sztring, akkor az továbbadódik az Out-Host -nak, és az megjeleníti a szöveget a képernyőn.

Ha a kimenet nem sztring, akkor Out-Default megvizsgálja az objektumot és megnézni, hogy van-e nézet definiálva az objektumtípushoz. Ilyen nézetdefiníciók már „gyárilag” is vannak a rendszerben, de mi magunk is tudunk ilyeneket létrehozni XML adatformátumban, amelyeket az Update-FormatData  cmdlet segítségével tudunk regisztrálni a PowerShell környezettel. Ebben az XML fájlban definiáljuk a Format-Wide, -List, -Table és –Custom cmdletek futtatására megjelenő formátumot, azaz hogy melyik tulajdonságokat írja ki és milyen formában.

Ha nincs az adattípusnak regisztrált nézete, akkor az Out-Default megnézi, hogy a kimenet első objektumának vajon van-e legalább öt tulajdonsága. Ha igen, akkor lista nézetet használ, ha nincs, akkor táblázatos nézetet:

[10] PS C:\> $p = @{e=1;k=2}

[11] PS C:\> $x = New-Object -Property $p -TypeName psobject

[12] PS C:\> $x

 

                                      k                                      e

                                      -                                      -

                                      2                                      1

[13] PS C:\> $p =@{e=1;k=2;h=3;n=4;o=5;t=6}

[14] PS C:\> $y = New-Object -Property $p -TypeName psobject

[15] PS C:\> $y

 

 

o : 5

h : 3

k : 2

t : 6

e : 1

n : 4

A [10]-[12] sorokban egy egyedi objektumot hoztam létre két tulajdonsággal. A kimenet táblázatos lett. A [13]-[15] sorokban hasonló módon hat tulajdonsággal hoztam létre objektumot, így alaphelyzetben lista nézetet kaptam. Fontos hangsúlyozni, hogy az első objektum dönt:

[20] PS C:\> $x, (Get-Process powershell) | Format-Table

 

                                      k                                      e

                                      -                                      -

                                      2                                      1

A fenti példában még az is látszik, hogy szegény PowerShell processz meg sem jelent a Format‑Table kimenetén, mert nincs se „k”, se „e” tulajdonsága.

Ha meg szeretnénk jeleníteni minkét objektumot önállóan, a saját tulajdonságai szerint, akkor „resetelhetjük” a kimenetet az Out-Default  cmdlettel, azaz ami addig összegyűlt kitesszük a kimenetre, és új életet kezdünk a megjelenítés szempontjából:

PS C:\> ($x | Out-Default), ((Get-Process) | Out-Default)

 

                                      k                                      e

                                      -                                      -

                                      2                                      1

 

 

 

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

    427      33   174320     170248   372    45,65   5288 AcroRd32

    230      18     4820       6388    95     1,31   3416 AdobeARM

     70       7     1164       2524    26            1580 ASLDRSrv

     63       7      944       4056    49            3064 ATKOSD

    389      14    29880      26508    84            1052 audiodg

Nézzük, hogyan lehet az egyéni típusokat kicsit szebben megjeleníteni. Az előző fejezetben létrehozott email típus egy objektuma alaphelyzetben láthattuk, hogy így néz ki. Most definiálok ilyen e-mail címek egy tömbjét:

[4] PS C:\> $addrs = @()

[5] PS C:\> $addrs += New-Object email soost, iqjb.hu

[6] PS C:\> $addrs += New-Object email bakaigy, iqjb.hu

[7] PS C:\> $addrs += New-Object email soostibor, citromail.hu

[8] PS C:\> $addrs += New-Object email valaki, citromail.hu

[9] PS C:\> $addrs += New-Object email tanfolyam, iqjb.hu

[10] PS C:\> $addrs

 

alias                      domain                    fullemail

-----                      ------                    ---------

soost                      iqjb.hu                   soost@iqjb.hu

bakaigy                    iqjb.hu                   bakaigy@iqjb.hu

soostibor                  citromail.hu              soostibor@citromail.hu

valaki                     citromail.hu              valaki@citromail.hu

tanfolyam                  iqjb.hu                   tanfolyam@iqjb.hu

Ha például nekem jobban tetszene az, hogy az első oszlopban jelenjen meg a fullemail cím tulajdonság, és e-mail tartományonként csoportosítva legyenek a címek, akkor ehhez készíthetek egy speciális formázó XML kifejezést, ami nagyon hasonlít a típusok testre szabásánál látott PS1XML fájlokhoz:

<?xml version="1.0" encoding="utf-8" ?>

 

<Configuration>

 

    <ViewDefinitions>

                <View>

            <Name>email</Name>

            <ViewSelectedBy>

                <TypeName>email</TypeName>

            </ViewSelectedBy>

            <GroupBy>

                <PropertyName>domain</PropertyName>

            </GroupBy>

 

            <TableControl>

                <TableHeaders>

                    <TableColumnHeader>

                        <Width>30</Width>

                    </TableColumnHeader>

                    <TableColumnHeader>

                        <Width>15</Width>

                    </TableColumnHeader>

                    <TableColumnHeader>

                        <Width>15</Width>

                    </TableColumnHeader>

                </TableHeaders>

                <TableRowEntries>

                    <TableRowEntry>

                        <TableColumnItems>

                            <TableColumnItem>

                                <PropertyName>Fullemail</PropertyName>

                            </TableColumnItem>

                            <TableColumnItem>

                                <PropertyName>Alias</PropertyName>

                            </TableColumnItem>

                            <TableColumnItem>

                                <PropertyName>Domain</PropertyName>

                            </TableColumnItem>

                        </TableColumnItems>

                    </TableRowEntry>

                </TableRowEntries>

            </TableControl>

        </View>      

    </ViewDefinitions>

</Configuration>

Ez is egy PS1XML kiterjesztésű fájl, ebben tehát meghatároztam a <TypeName> címkénél, hogy melyik típushoz tartozik, majd a táblázat csoportosítását adtam meg, majd a fejlécét és oszlopait definiáltam. Ha azt akarom, hogy az utolsó oszlop a konzol teljes maradék szélességét kihasználhassa, akkor a TableColumnHeader részbe ne határozzunk meg szélességet, hagyjuk ezt a címkepárt üresen.

Ezután ezt a be kell tölteni a PowerShell alá az Update-FormatData  cmdlet segítségével:

[37] PS C:\> Update-FormatData -AppendPath C:\munka\email.format.ps1xml

Lehet a PowerShell saját típusdefinícióihoz képest később (-AppendPath) vagy előbb (‑PrependPath) betölteni ezeket a formátumdefiníciókat. Ha később töltjük be, akkor ezzel felül lehet bírálni a „gyári” formátumokat, ha előbb töltjük be, akkor csak akkor jut érvényre a formátum, ha azt később „gyári” formátum nem írja felül.

Nézzük, hogy ezután hogyan jelenik meg a táblázatom:

[12] PS C:\> $addrs

 

 

   domain: iqjb.hu

 

Fullemail                      Alias           Domain

---------                      -----           ------

soost@iqjb.hu                  soost           iqjb.hu

bakaigy@iqjb.hu                bakaigy         iqjb.hu

 

 

   domain: citromail.hu

 

Fullemail                      Alias           Domain

---------                      -----           ------

soostibor@citromail.hu         soostibor       citromail.hu

valaki@citromail.hu            valaki          citromail.hu

 

 

   domain: iqjb.hu

 

Fullemail                      Alias           Domain

---------                      -----           ------

tanfolyam@iqjb.hu              tanfolyam       iqjb.hu

Látható, hogy itt is a csoportosítás önmagában nem rendezi az elemeket, azaz csak egymáshoz képest nézi, hogy vajon új csoportot kell nyitni, vagy sem.

A „gyári” formátumfájlok a $PSHome elérési úton találhatók, nevükben benne van a format kifejezés. A legtöbb objektumtípus formázása a DotNetTypes.format.ps1xml és a PowerShellCore.format.ps1xml fájlban található.

Ezeket formázási információkat a Get-FormatData  cmdlettel lehet kiolvasni:

[21] PS C:\> Get-FormatData

 

TypeName                                FormatViewDefinition

--------                                --------------------

Microsoft.PowerShell.Commands.GetCou... {Counter , TableControl}

Microsoft.PowerShell.Commands.GetCou... {Counter , TableControl}

System.Xml.XmlElement#http://schemas... {System.Xml.XmlElement#http://schem...

Microsoft.WSMan.Management.WSManConf... {Microsoft.WSMan.Management.WSManCo...

email                                   {email , TableControl}

A lista alján található az én email osztályom megjelenítési adata. Ezt nézzük kicsit részletesebben, miután ez egy hierarchikus XML adat, ezért a legpraktikusabb a Format-Custom cmdlet használata:

[30] PS C:\> Get-FormatData email | Format-Custom

 

class ExtendedTypeDefinition

{

  TypeName = email

  FormatViewDefinition =

    [

      class FormatViewDefinition

      {

        Name = email

        Control =

          class TableControl

          {

            Headers =

              [

                class TableControlColumnHeader

                {

                  Label =

                  Alignment = Undefined

                  Width = 30

                }

                class TableControlColumnHeader

                {

                  Label =

                  Alignment = Undefined

                  Width = 15

                }

                class TableControlColumnHeader

                {

                  Label =

                  Alignment = Undefined

                  Width = 15

                }

              ]

 

            Rows =

              [

                class TableControlRow

                {

                  Columns =

                    [

                      Fullemail

                      Alias

                      Domain

                    ]

 

                }

              ]

 

          }

      }

    ]

 

}

Itt gyakorlatilag visszakaptam az eredeti XML fájl tartalmát, az emberi szemnek talán kicsit olvashatóbb formában.

Ezekben a formátum fájlokban lehetnek számolt információk is, hasonlóan, ahogy a types.PS1XML fájlokban is, de ilyenek létrehozása túlmutat jelen könyv keretein.

Megjegyzés

Nem csak az Out-Default, hanem minden Out-… kezdetű cmdlet (kivéve az Out-Null) épít a formázó XML fájlokban definiált formátumokra, és azok figyelembe vételével írja ki az objektumok megfelelő tulajdonságait az ott definiált formátumban.



Word To HTML Converter