Átalakítás szöveggé (Out-String)

Láthattuk, hogy jó dolog az objektumorientált megközelítés, az esetek döntő többségében jelentősen egyszerűbbé vált tőle az élet a hagyományos shellekkel összehasonlítva. Bizonyos esetekben mégis szükség lehet arra, hogy az objektumokból álló kimenetet szövegként dolgozzuk fel, és például egy szöveges keresés alapján válogassuk ki belőle azokat a sorokat, amelyekre szükségünk van. Nem szerencsés például az objektumos kimenet, ha az, amit keresünk, több tulajdonság értékében is előfordulhat, és nekünk azok a sorok kellenek, amelyekben akárhol is, de előfordul (vagy éppen hiányzik) a keresett érték.

Listázzuk ki egy Get-Process alapértelmezett kimenetéből azokat a sorokat, amelyekben (bármelyik oszlopban!) előfordul a „44” karakterlánc! Az objektumok szöveges változatának előállítására az Out-String  cmdlet képes. Bemenetére tetszőleges objektumokat küldhetünk (például formázott táblázatot, listát, stb. is), a kimenetén egy hosszú karakterlánc fog megjelenni, amely mindazt tartalmazza, amit a bemenet a képernyőre írt volna. Próbáljuk ki a következőt:

PS C:\> get-process | out-string

 

 

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

     66       3      864       2808    30     0,08    416 ctfmon

    173       5     3564       5340    33     0,19   1100 CTHELPER

     29       1      380        756    15     0,02   1436 CTSVCCDA

    473       6     2144       2420    28    11,45    612 csrss

    689      18    25440      18048   107    50,84   3804 explorer

Látszólag semmi különbség nincs az önálló Get-Process-hez képest, de ha a kimenetre kérünk egy Get-Member-t, akkor látható, hogy az már nem System.Diagnostics.Process objektumokból áll, hanem egyszerű karakterlánccá alakult.

Már csak a szöveges keresés van hátra, amelyet a Select-String  cmdlet segítségével fogunk elvégezni (ezzel részletesen a 2.6.7 Szövegfájlok beolvasása (Get-Content) fejezetben lesz szó):

PS C:\> get-process | out-string | select-string -pattern "44"

Valami még nem egészen kerek, mivel ismét csak a teljes listát kaptuk vissza. Mi lehet a baj? Az Out-String cmdlet alapértelmezés szerint egyetlen karakterláncot ad vissza, ami a teljes listát tartalmazza a sortörésektől függetlenül. A teljes listában persze ott van a keresett minta, így az egyetlen karakterlánc közül azt az egyet kiírtuk a képernyőre. Soronként tördelt kimenetet (karakterláncokból álló tömböt) a -stream paraméter használatával kérhetünk, a helyes megoldás tehát:

PS C:\> get-process | out-string -stream | select-string -pattern "44"

 

     37       2     2016         40    30     0,09   3144 cmd

     63       3     1068        372    30     0,09    844 daemon

    779      20    67944       7200   198    19,30   2496 iexplore

     21       1      168        144     4     0,08    920 smss

    162       7     4960       2652    60     0,44   1968 spoolsv

    142       4     2396        372    44     0,50    640 VsTskMgr

Az out-string-nek van még egy praktikus paramétere, ez pedig a –width. Ez akkor jöhet jól, ha nagyon széles táblázatot akarunk megjeleníteni, és az alaphelyzet szerinti 80 karakteres szélesség túl kevésnek tűnik. Mi van akkor, ha a get-process-szel a folyamatok összes tulajdonságát meg akarom jeleníteni. Ez 80 karakterben gyakorlatilag reménytelen, nézzük meg, hogy 600 karakterbe hogyan fér el:

[19] PS C:\>get-process | ft -Property * | out-string -Width 600 -Stream > c

:\old\proc.txt

Ezek után nézzük Notepad-del a fájlt:

54 . ábra 600 karakter széles szöveg Notepadben

A sortörést kikapcsoltam, és látszik, hogy viszonylag jól elférünk már. Az alsó gördítő sáv méretéből látható, hogy elég jócskán lehet vízszintesen görgetni ezt a táblázatot. Ezzel gyakorlatilag ugyanazt az eredményt értem el, mint az out-file cmdlet használatával, megfelelő –width paraméterrel.



Word To HTML Converter