Gyakran előfordulnak olyan szöveges fájlok, amelyekben az információblokkok nem korlátozódnak egy-egy sorra, hanem átnyúlnak sorvégeken. Ez speciális odafigyelést és feldolgozási módot igényel, hiszen – ahogy láttuk – például a get-content is soronként dolgozza fel a szöveges állományokat.
Példaként nézzünk egy olyan szöveges állományt, amelyet maga a PowerShell hoz létre a start‑transcript cmdlet segítségével:
[33] PS C:\> Start-Transcript C:\powershell2\scripts\transforregex.txt
Transcript started, output file is C:\powershell2\scripts\transforregex.txt
[34] PS C:\> "Ez egy rövid sor"
Ez egy rövid sor
[35] PS C:\> "Ez egy hosszú sor igazi sortörés nélkül, viszont átnyúlik két
sorba"
Ez egy hosszú sor igazi sortörés nélkül, viszont átnyúlik két sorba
[36] PS C:\> "Ez egy kétsoros
>> szöveg"
>>
Ez egy kétsoros
szöveg
[37] PS C:\> Stop-Transcript
Transcript stopped, output file is C:\powershell2\scripts\transforregex.txt
A fenti példában indított transcript tartalmaz mindenféle hosszúságú sort, mesterségesen nyitott új sort alprompttal. Az elkészült fájl a következőképpen néz ki Notepaddal nézve:
110 . ábra Transcript fájl
Láthatjuk, hogy csak ott tett a fájlba sortörést, ahol tényleg Entert ütöttünk. Olvassuk be ezt a fájlt:
[41] PS C:\> $text = get-content C:\powershell2\scripts\transforregex.txt
Az így kapott $text változó egy sztringtömböt eredményez, amelynek egyes elemei a fájl sorai:
[42] PS C:\> $text[8]
Ez egy rövid sor
Hogy lehetne ebből egy olyan sztringet készíteni, amely tartalmazza az összes sort? Egyik lehetőség, hogy a –join operátorral összefűzzük a szöveget a soremelés karaktereinek beiktatásával:
[43] PS C:\> $text = $text -join "`r`n"
Hogy az eredeti információtartalmat megőrizzük, én egy „kocsivissza-újsor” kombinációval fűztem össze a szövegem darabjait, merthogy a Windowsban ez a „hivatalos” sortörés.
Másik lehetőség az, hogy eleve a beolvasást más módszerrel végezzük, szintén a .NET keretrendszer segítségével, a File objektumtípus ReadAllText statikus metódusának segítségével:
[44] PS C:\> $text2 = [System.IO.File]::ReadAllText("c:\powershell2\scripts\
transforregex.txt")
Ha legalább PowerShell 3.0-nk van, akkor harmadik lehetőségként használhatjuk a beolvasásnál a –Raw paramétert:
PS C:\> Get-Content -Path 'C:\PSKönyv\Szöveggel.txt'
Első sor
Második sor
PS C:\> (Get-Content -Path 'C:\PSKönyv\Szöveggel.txt') -is [string]
False
PS C:\> (Get-Content -Path 'C:\PSKönyv\Szöveggel.txt' -raw) -is [string]
True
Látható a fenti példában, hogy ha „simán” olvassuk be a szöveget, akkor kételemű tömböt kapunk, nem pedig sztringet, míg ha használjuk a –Raw kapcsolót, akkor egy többsoros szöveget kapunk eredményül.
Akármelyik módszert is választjuk, ugyanolyan eredményt kapunk, így immár egyszerűbben tudunk akár soron átnyúló regex kifejezéssel keresni.
Nézzük azt is, hogyan tudunk sortöréssel és sortörés nélkül szövegfájlokat létrehozni? A PowerShell a szövegfájlokat nem csak soronként olvassa, hanem így is írja. Nézzünk erre egy példát:
[1] PS C:\> "első sor" | Out-File c:\ee\szöveg.txt
[2] PS C:\> "második sor" | Out-File c:\ee\szöveg.txt -Append
[3] PS C:\> Get-Content C:\ee\szöveg.txt
első sor
második sor
Az első sorban létrehoztam egy szövegfájlt egy sorral, majd a második sorban ehhez hozzáírtam, az Out-File cmdletet használtam az –append kapcsolóval. Látható a visszaolvasott szövegben ez a hozzáfűzés egy sortörés beiktatásával történt.
Néha szükség lehet sortörés nélküli hozzáírásra is. Ehhez a .NET keretrendszer [System.IO.File] osztályának AppendAllText metódusát használhatjuk:
[18] PS
C:\> [IO.File]::AppendAllText("C:\ee\szöveg.txt","közvetlen
hozzáfűzés"
,[text.encoding]::unicode)
[19] PS
C:\> Get-Content C:\ee\szöveg.txt
első sor
második
sor
közvetlen
hozzáfűzés
[20] PS
C:\> [IO.File]::AppendAllText("C:\ee\szöveg.txt","közvetlen
hozzáfűzés2
",[text.encoding]::unicode)
[21] PS
C:\> Get-Content C:\ee\szöveg.txt
első sor
második
sor
közvetlen
hozzáfűzésközvetlen hozzáfűzés2
Vigyázzunk, mert ennek nem lesz első alkalommal még hatása! Mint ahogy a [18]-[19]-es sorokban láthatjuk, az így hozzáírt szöveg még nem sorfolytonos. Ennek pontos okát nem tudom, hiszen az Out-File nem helyez automatikusan sortörést a fájl végére, de mégis az AppendAllText első alkalommal sortöréssel illeszt, viszont a második alkalommal már sorfolytonos lett a hozzáfűzés.