Az output fogalmához tartozik hozzá, hogy három alapvető formázási módról beszéljek. Említettem, hogy a PowerShell objektumokat kezel, amelyeknek különböző kiolvasható tulajdonságaik (property) vannak. Egy-egy objektum típusnak nagyon sok ilyen tulajdonsága is lehet, így probléma, hogy akkor egy ilyen objektumot hogyan is jelenítsünk meg a képernyőn, hiszen ez az elsődleges interakciós felületünk a PowerShellel.
Nézzünk a problémára egy példát, listázzuk ki a gépen futó W-vel kezdődő szolgáltatásokat:
[47] PS C:\> get-service w*
Status Name DisplayName
------ ---- -----------
Running W32Time Windows Time
Running WebClient WebClient
Stopped WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running winmgmt Windows Management Instrumentation
Stopped WmdmPmSN Portable Media Serial Number Service
Stopped Wmi Windows Management Instrumentation ...
Stopped WmiApSrv WMI Performance Adapter
Running wscsvc Security Center
Running WSearch Windows Search
Running wuauserv Automatic Updates
Running WZCSVC Wireless Configuration
Látszik, hogy alaphelyzetben táblázatos nézetben látjuk a szolgáltatások három tulajdonságát: Status, Name, DisplayName. A „DisplayName” oszlopban nem minden szöveg fér ki, ezért van egy másik listázási lehetőségünk is:
[48] PS C:\> get-service w* | format-list
Name : W32Time
DisplayName : Windows Time
Status : Running
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
ServiceType : Win32ShareProcess
Name : WebClient
DisplayName : WebClient
Status : Running
DependentServices : {}
ServicesDependedOn : {MRxDAV}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
ServiceType : Win32ShareProcess
Name : WinHttpAutoProxySvc
DisplayName : WinHTTP Web Proxy Auto-Discovery Service
Status : Stopped
DependentServices : {}
ServicesDependedOn : {Dhcp}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : Win32ShareProcess
…
Itt már jól kiférnek a hosszabb feliratok is, ezt a formázást hívjuk lista nézetnek, és az objektumok ilyen jellegű megjelenítését a format-list cmdlet végzi. Ezt olyan gyakran használjuk, hogy ennek rövid alias nevét érdemes mindenképpen megjegyezni: fl .
Van, hogy pont az ellenkezőjére van szükség, a listanézet helyett szeretnénk táblázatos nézetet. Ennek cmdletje a format-table , röviden az ft .
Mindkét esetben kapunk egy alaphelyzet szerinti tulajdonságlistát. Azaz nem szabad megijedni, ha pont azokat az információkat nem látjuk, amire szükségünk lenne. Először érdemes minden objektum esetében a get-member-rel ellenőrizni a tulajdonságok listáját és utána ezekre hivatkozhatunk a format- parancsoknál:
[11] PS C:\> Get-Service w* | Get-Member -MemberType properties
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
CanPauseAndContinue Property System.Boolean CanPauseAndContinue {...
CanShutdown Property System.Boolean CanShutdown {get;}
CanStop Property System.Boolean CanStop {get;}
Container Property System.ComponentModel.IContainer Con...
DependentServices Property System.ServiceProcess.ServiceControl...
DisplayName Property System.String DisplayName {get;set;}
MachineName Property System.String MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeH...
ServiceName Property System.String ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceControl...
ServiceType Property System.ServiceProcess.ServiceType Se...
Site Property System.ComponentModel.ISite Site {ge...
Status Property System.ServiceProcess.ServiceControl...
[12] PS C:\> Get-Service w* | Format-Table Name, Status, CanStop
Name Status CanStop
---- ------ -------
W32Time Running True
WcsPlugInService Stopped False
WdiServiceHost Stopped False
WdiSystemHost Stopped False
Wecsvc Stopped False
wercplsupport Stopped False
WerSvc Stopped False
WinHttpAutoProxySvc Stopped False
Winmgmt Running True
WinRM Running True
wmiApSrv Stopped False
WPDBusEnum Stopped False
wuauserv Running True
wudfsvc Stopped False
Az [11]-es promptnál lekérdezem a szolgáltatások tulajdonságait. Látszik, hogy okos a Get‑Member, hiszen több szolgáltatás-objektumot kap a bemeneteként, de mivel mindegyik egyforma típusú, teljesen egyforma tulajdonságaik vannak, így csak egyszer adja meg a tulajdonságlistát.
Ezután a [12]-es promptban kiválasztottam, hogy a Name, Status, CanStop tulajdonságok kellenek nekem, ezeket átadom paraméterként a Format-Table cmdletnek és megkapom a kívánt táblázatot.
Ezt még szebbé lehet tenni az –AutoSize kapcsolóval, amellyel csak a szükséges minimális táblázatszélességet használja, és nem húzza szét az egészet a képernyőn:
[13] PS C:\> Get-Service w* | Format-Table Name, Status, CanStop -AutoSize
Name Status CanStop
---- ------ -------
W32Time Running True
WebClient Running True
WinHttpAutoProxySvc Stopped False
winmgmt Running True
WmdmPmSN Stopped False
Wmi Stopped False
WmiApSrv Stopped False
wscsvc Running True
WSearch Running True
wuauserv Running True
WZCSVC Running True
Megjegyzés
A PowerShell 5.0-tól kezdődően nem feltétlenül kell a Format-Table-nél az ‑AutoSize kapcsolót használnunk. Az előző példa itt -AutoSize nélkül is ugyanúgy néz ki:
PS C:\> Get-Service w* | Format-Table Name, Status, CanStop
Name Status CanStop
---- ------ -------
W32Time Stopped False
w3logsvc Stopped False
W3SVC Running True
WalletService Stopped False
…
Általánosságban az objektumok megjelenítésénél van egy
kb. 350 ms késleltetés, az addig megszületett objektumok tulajdonságai alapján
igazítja alaphelyzetben az oszlopok szélességét. Ezt a következő kis pársoros
programmal lehet tesztelni:
$start = Get-Date
1..20 | %{
Start-Sleep -Milliseconds 20
[pscustomobject] @{
Idő = "{0,10}" -f ((Get-Date) - $start).TotalMilliseconds
egy = "a" * $_
kettő = "b" * $_
}
}
Ezt futtatva:
Idő egy kettő
--- --- -----
46,8898 a b
78,1402 aa bb
98,2858 aaa bbb
131,5515 aaaa bbbb
162,8024 aaaaa bbbbb
194,0528 aaaaaa bbbbbb
231,8411 aaaaaaa bbbbbbb
263,0911 aaaaaaaa bbbbbbbb
294,342 aaaaaaaaa bbbbbbbbb
316,5037 aaaaaaaaaa bbbbbbbbbb
347,7553 aaaaaaaaaaa bbbbbbbbbbb
379,0086 aaaaaaaaaaaa bbbbbbbbbbbb
416,7859 aaaaaaaaa... bbbbbbbbb...
448,0375 aaaaaaaaa... bbbbbbbbb...
479,2867 aaaaaaaaa... bbbbbbbbb...
517,0624 aaaaaaaaa... bbbbbbbbb...
548,3124 aaaaaaaaa... bbbbbbbbb...
579,5636 aaaaaaaaa... bbbbbbbbb...
617,3511 aaaaaaaaa... bbbbbbbbb...
648,6036 aaaaaaaaa... bbbbbbbbb...
Az első oszlopban van az eltelt idő miliszekundumokban. Láthatjuk, hogy 379 ms-ig még kifér a folytonosan növekvő szöveget tartalmazó tulajdonság az oszlopokban, utána már csonkítás lesz. Azaz az eddig létrejött objektumok közül megnézte a legszélesebb helyet igénylő tulajdonságút és ehhez méretezte a táblázatot. Ha a programban a Start-Sleep cmdletnél levő késleltetést hosszabbra, 50-re veszem, akkor már a 6. objektum után jön a csonkítás, ekkorra telt le a türelmi ideje:
Idő egy kettő
--- --- -----
65,419 a b
126,8146 aa bb
195,8251 aaa bbb
258,3259 aaaa bbbb
311,7151 aaaaa bbbbb
374,2151 aaaaaa bbbbbb
443,2296 aaa... bbb...
496,6192 aaa... bbb...
559,1171 aaa... bbb...
628,1333 aaa... bbb...
…
Ez az aprónak tűnő újítás nagyon sok felesleges Format-Table-től kímél meg minket.
A Format-Table néhány ügyes további lehetőségét is nézzük
meg! Például keressük az „a” és „b” betűvel kezdődő nevű szolgáltatásokat:
[14] PS C:\> Get-Service [a-b]*
Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience Lookup Service
Stopped Alerter Alerter
Running ALG Application Layer Gateway Service
Stopped AppMgmt Application Management
Stopped aspnet_state ASP.NET State Service
Running AudioSrv Windows Audio
Stopped BITS Background Intelligent Transfer Ser...
Stopped Browser Computer Browser
Csoportosítsuk ezeket Status szerint:
[15] PS C:\> Get-Service [a-b]* | ft -GroupBy Status
Status: Running
Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience Lookup Service
Status: Stopped
Status Name DisplayName
------ ---- -----------
Stopped Alerter Alerter
Status: Running
Status Name DisplayName
------ ---- -----------
Running ALG Application Layer Gateway Service
...
Hoppá! Ez nem
valami jó. Itt tetten érhetjük a csövezést. Ugye a format-table szépen kapja egymás után a szolgáltatásokat
és nyit egy aktuális csoportot a Status alapján. Ha a következő szolgáltatás is
ugyanilyen státusú, akkor szépen mögé biggyeszti, de ha nem, akkor nyit egy új
csoportot. Azaz kicsit összevissza az eredményünk, ha nem rendezetten érkeznek
az elemek.
A megoldás az
lenne, hogy ideiglenesen összegyűjtenénk a csővezetéken átmenő összes
objektumot egy pufferben, és utána berendezzük az elemeket Status alapján, majd ezután jelenítjük meg a
csoportosított nézetet. Ezt a pufferelést és sorbarendezést végzi a Sort‑Object
cmdlet:
[16] PS C:\> Get-Service [a-b]* | sort-object status, name |ft -GroupBy Status
Status: Stopped
Status Name DisplayName
------ ---- -----------
Stopped Alerter Alerter
Stopped AppMgmt Application Management
Stopped aspnet_state ASP.NET State Service
Stopped BITS Background Intelligent Transfer Ser...
Stopped Browser Computer Browser
Status: Running
Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience Lookup Service
Running ALG Application Layer Gateway Service
Running AudioSrv Windows Audio
Ha pedig a hosszú nevű
szolgáltatások neveit is szeretnénk látni teljesen, akkor a ‑wrap
kapcsolót
érdemes használni:
[17] PS C:\> Get-Service [a-b]* | sort-object status, name |ft -GroupBy Status -wrap
Status: Stopped
Status Name DisplayName
------ ---- -----------
Stopped Alerter Alerter
Stopped AppMgmt Application Management
Stopped aspnet_state ASP.NET State Service
Stopped BITS Background Intelligent Transfer Servic
e
Stopped Browser Computer Browser
Status: Running
Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience Lookup Service
Running ALG Application Layer Gateway Service
Running AudioSrv Windows Audio
Megjegyzés:
Kicsit ízlelgessük ezt a kifejezésrészt: „Format-Table Name, Status, CanStop”. Most ez itt mi? Miért van itt vessző? Nem elég a szóköz? Majd később nézzük részletesen a kifejezések argumentumait, elöljáróban annyit, hogy a Format-Table itt egy háromelemű tömböt kap argumentumként, ezért kell vessző.
Melyik argumentuma kaphat tömböt?
A súgóból ez látszik:
PS C:\> Get-Help Format-Table -Parameter property
-Property <Object[]>
Specifies the object properties that appear in the display and the order i
n which they appear. Type one or more property names (separated by commas)
, or use a hash table to display a calculated property. Wildcards are perm
itted.
…
Az <Object[]> jelzés végén a szögletes zárójelpár jelöli a tömböt. Azaz a PowerShellben nagyon fontos, hogy a több paramétert nem a vessző jelzi, hanem a szóköz! Viszont a tömbök esetében az elemeket vesszővel kell elválasztani.