Szöveges fájlok olvasására a Get-Content cmdlet szolgál, amint azt már korábban is láthattuk. Paraméterként egy, vagy több fájl nevét kell megadnunk, a kimenetbe pedig a fájlok tartalma kerül soronként egy-egy karakterlánc képében:
PS C:\> $soronként = Get-Content C:\Windows\debug\mrt.log
PS C:\> $soronként[3]
Started On Wed Aug 12 21:29:48 2015
A fenti példában egy log fájlt olvastam be, a negyedik elemét külön megvizsgáltam, ami a fájl egy sora.
Tehát a beolvasás soronként történik alaphelyzetben, így egy sok sorból álló fájl beolvasása sok I/O műveletet igényel, ami lassúvá teszi a művelete. Akkor lehet ez előnyös, ha csővezetékben dolgozzuk fel a sorokat, és a sorok tartalmától függően esetleg nem az összes sort akarjuk beolvasni, így fölösleges sorokat nem kell beolvasnunk.
A másik véglet, hogy beolvassuk az egész fájlt egyben. Ez I/O szempontjából gyors, viszont nagyon nagy fájl esetében sok memóriát fogyaszthat. A két véglet között választhatunk valami köztes értéket a -ReadCount paramétert használatával:
PS C:\> $tízsoronként = Get-Content C:\Windows\debug\mrt.log -ReadCount 10
PS C:\> $tízsoronként[3]
Engine: 1.1.11903.0
Signatures: 1.203.693.0
Microsoft Windows Malicious Software Removal Tool Finished On Sat Aug 15 08:01
:42 2015
Return code: 0 (0x0)
------------------------------------------------------------------------------
---------
Microsoft Windows Malicious Software Removal Tool v5.27, August 2015 (build 5.
27.11700.0)
A fenti példában 10 soronkénti olvasást választottam, ugyanazt a 4. elemet kiolvasva azonban más eredményt kapunk. Mi történt? Ilyenkor, ha nem soronként olvassuk a fájlt, akkor az eredménytömb elemei nem 1-1 sorok lesznek, hanem annyi sorok, amennyit beolvastunk:
PS C:\> $tízsoronként[3].count
10
A korábban kiolvasott igazi 4. sort tehát kettős indexszel érhetjük el:
PS C:\> $tízsoronként[0][3]
Started On Wed Aug 12 21:29:48 2015
A másik végletet választásához a -ReadCount értékét 0-ra kell választanunk. Ekkor tehát beolvassuk az összes sort egyben és ilyenkor is egy „sima” tömböt kapunk:
PS C:\> $összes = Get-Content C:\Windows\debug\mrt.log -ReadCount 0
PS C:\> $összes[3]
Started On Wed Aug 12 21:29:48 2015
Azaz akármelyik változatot választjuk, akkor valamilyen tömböt kapunk eredményként, ha semmit vagy 0-t választjuk a -ReadCount értékének, akkor egy-egy sor a tömb eleme, ha egyéb érték a ReadCount, akkor pedig a tömb elemei szintén tömbök lesznek, és ott lesznek a soraink.
Mindez akkor okoz problémát, ha például a teljes szövegben akarunk valamilyen szót, kifejezést keresni, vagy kicserélni. Ilyenkor vagy valamilyen ciklust kell írjunk, vagy külön össze kell fűzzük a sorokat, majd az eredményre kell elvégeznünk a műveletet.
PowerShell 3.0-tól kezdődően van egy újabb lehetőségünk, a -Raw kapcsoló használatával. Ezzel egy nagy string-et kapunk, nem sok sort:
PS C:\> $egyben = Get-Content C:\Windows\debug\mrt.log -Raw
PS C:\> $egyben.GetType().fullname
System.String
Ha a -Raw kapcsolót használom együtt a -ReadCount-al, akkor az eredmény egy egyelemű tömb lesz, melynek ez az 1 eleme lesz a teljes szöveg:
PS C:\> $egyben = Get-Content C:\Windows\debug\mrt.log -ReadCount 10 -Raw
PS C:\> $egyben.GetType().fullname
System.Object[]
PS C:\> $egyben.Count
1
PS C:\> $egyben[0].GetType().fullname
System.String
Ha nincs szükség a fájl teljes tartalmára, akkor a -TotalCount paraméterrel behatárolhatjuk, hogy hány sort olvassunk be:
PS C:\> $kevés = Get-Content C:\Windows\debug\mrt.log -TotalCount 10
PS C:\> $kevés.Count
10
Szövegfájlokat többféleképpen lehet kódolni. PowerShellben az alaphelyzet szerinti kódolás az unicode. Ha más kódolással van tárolva egy fájl, akkor az -Encoding paraméterrel kiválaszthatjuk a helyeset. A lehetőségek a következők:
PS C:\> [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding].GetEnu
mNames()
Unknown
String
Unicode
Byte
BigEndianUnicode
UTF8
UTF7
UTF32
Ascii
Default
Oem
BigEndianUTF32