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:
59 . á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.