Formázó operátor (-f)

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!



Word To HTML Converter