Láttuk az 1.2.15 Kimenet (Output) fejezetben, hogy a write-host cmdlet alkalmas arra, hogy színesen írjunk a képernyőre, de hogyan lehet mondjuk egy szép táblázatot kiíratni?
Az alábbi kis szkriptben – felhasználva a korábban már bemutatott tartomány-operátort – azt szeretném, hogy a számokat írja ki a PowerShell a nevükkel együtt szép, táblázatszerű módon. A [24]-es promptban készítek egy tömböt, ami tartalmazza a számokat egytől tízig, a [26]-os promptban pedig a korábban bemutatott tartomány-operátor segítségével kiírom a számokat és a nevüket.
[24] PS C:\> $tomb= "egy", "kettő", "három", "négy", "öt", "hat", "hét", "nyolc", "kilenc", "tíz"
[25] PS C:\> $tomb
egy
kettő
három
négy
öt
hat
hét
nyolc
kilenc
tíz
[26] PS I:\>0..9 | foreach-object {($_+1), $tomb[$_]}
1
egy
2
kettő
3
három
4
négy
5
öt
6
hat
7
hét
8
nyolc
9
kilenc
10
tíz
Látjuk, hogy ez nem túl szép kimenet, hiszen egymás alatt vannak a számok és neveik, jó lenne, ha ezek egymás mellett lennének. Ugyan használhatnánk a write-host cmdletet a ‑nonewline kapcsolóval, vagy az $OFS változót, de ennél van egyszerűbb megoldás: a -f formázó operátor:
[27] PS I:\>0..9 | foreach-object {'{0} {1}' -f ($_+1), $tomb[$_]}
1 egy
2 kettő
3 három
4 négy
5 öt
6 hat
7 hét
8 nyolc
9 kilenc
10 tíz
Ennek a működése a következő:
A –f előtt kell a formátumot leíró sztringet beírni, a –f után meg a formázandó kifejezést. Mivel ez utóbbiból több is lehet (a példámban a ($_+1) és a $tomb[$_]), ezért a formázó sztringben is mindkét elemre hivatkozni kell. A hivatkozás formája pedig {0} az első formázandó kifejezést szimbolizálja, a {1} a másodikat és így tovább.
De nem csak egyszerűen hivatkozhatunk a formázandó kifejezésekre, hanem sokkal bonyolultabb műveleteket is végezhetünk velük:
[1] PS C:\> "Szöveg elöl {0,-15} és nem hátul" -f "itt van"
Szöveg elöl itt van és nem hátul
[2] PS C:\> "Szöveg nem elöl {0,15} hanem hátul" -f "van"
Szöveg nem elöl van hanem hátul
[3] PS C:\> "Ez most az óra: {0:hh}" -f (get-date)
Ez most az óra: 10
[4] PS C:\> "Ez most a forint: {0:c}" -f 11
Ez most a forint: 11,00 Ft
[5] PS C:\> "Ez most a szép szám: {0:n}" -f 1234568.9
Ez most a szép szám: 1 234 568,90
[6] PS C:\> "Ez most a százalék: {0:p}" -f 0.561
Ez most a százalék: 56,10 %
[7] PS C:\> "Ez most a hexa szám: {0:x}" -f 3000
Ez most a hexa szám: bb8
[8] PS C:\> "Ez most a 8 számjegyű hexa szám: {0:x8}" -f 3000
Ez most a 8 számjegyű hexa szám: 00000bb8
[9] PS C:\> "Ez most a forint, fillér nélkül: {0:c0}" -f 11
Ez most a forint, fillér nélkül: 11 Ft
[10] PS C:\> "Ez most rövid dátum: {0:yyyy. M. d}" -f (get-date)
Ez most rövid dátum: 2008. 4. 18
[11] PS C:\> "Ez most hosszú dátum: {0:f}" -f (get-date)
Ez most hosszú dátum: 2008. április 18. 23:10
[12] PS C:\> "Sok számjegyre kiegészített szám: {0:d8}" -f 1
Sok számjegyre kiegészített szám: 00000001
A szélesség és megjelenítés szabályozóit vegyíthetjük is. A következő példában véletlen számokat írok ki szépen két tizedessel, jobbra igazítva:
[12] PS C:\> 1..5 | foreach-object {"Szép szám: {0,8:n2}!" -f (get-random -Maxi
mum 120.0001)}
Szép szám: 83,50!
Szép szám: 119,30!
Szép szám: 85,46!
Szép szám: 67,46!
Szép szám: 100,88!
Aztán számokkal lehet akármilyen mintázatot is kirakni:
[22] PS C:\> "Ez most a telefonszám: {0:(##) ###-####}" -f 303116867
Ez most a telefonszám: (30) 311-6867
Megjegyzés:
A legtöbb formázási művelet elvégezhető a ToString metódussal (ami nagyon sok típusnál megtalálható):
[23] PS C:\> (303116867).ToString("(##) ###-####")
(30) 311-6867
Fontos hangsúlyozni, hogy ezeknek a formázási műveleteknek a kimenete mindig sztring, azaz a formázás után elveszítik az eredeti tulajdonságaikat. Azaz csak egy műveletsor legvégén érdemes formázni, amikor már csak a megjelenítés van hátra, egyéb feldolgozási műveleteken már túljutottunk. Amúgy még sokkal több formázási lehetőség van, javaslom az MSDN honlapján utánanézni.
Visszatérve a számok és neveik kiírásához, még szebben rendezve:
[24] PS C:\> 0..9 | foreach-object {'{1,-6} : {0,2}' -f ($_+1), $tomb[$_]}
egy : 1
ketto : 2
harom : 3
negy : 4
ot : 5
hat : 6
hét : 7
nyolc : 8
kilenc : 9
tíz : 10
Ugye ez már ezek után érthető, előre vettem a tömbelemet, hat karakter szélességben, balra igazítva, utána a tömbindexet, két karakter szélességben, jobbra igazítva.
Megjegyzés
Végezetül egy meglepő kifejezés:
[26] PS I:\>Get-Date -f MMddyyHHmmss
052708131411
Vigyázat! Ez nem formátum operátor, hanem a get-date-nek a format paramétere rövidítve! Ennek használatáról bővebben a http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx oldalon lehet olvasni.
Egyébként ezzel egyszerűen azt is ki lehet olvasni, hogy mi a gépünk időzóna beállítása:
PS C:\> Get-Date -f zz
+02
Ilyen egyszerű az egész!