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.