Egyszerű formázás

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.



Word To HTML Converter