A PowerShellben elég sok lehetőségünk van arra, hogy szövegfájlokat hozzunk létre és hogy szöveget írjunk egy meglevő szövegfájlba. Ebben a fejezetben ezeket a lehetőségeket veszem számba, kiemelve az egyes módszerek előnyeit, hátrányait, speciális alkalmazási területeit.
A Set-Content – Add-Content páros csak annyiban különbözik, hogy a Set-Contenttel felülírni vagy létrehozni lehet szövegfájlt, Add-Contenttel létrehozni és hozzáírni lehet. Amúgy a paraméterezésük nagyon hasonló. A fontos megjegyezni ennél a párosnál, hogy mindenképpen szöveget kell nekik átadni, objektumokkal nehezen bánnak el. Ha nem szöveget kapnak, akkor az objektum ToString() metódusát hívják meg implicit módon, és ennek eredményét teszik be a fájlba. Láttuk már korábban, hogy például a Service objektumoknál ez nem túl informatív:
PS C:\> Get-Service wu*
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update
Running wudfsvc Windows Driver Foundation - User-mo...
PS C:\> Get-Service wu* | Set-Content C:\_myfiles\services.txt
PS C:\> Get-Content C:\_myfiles\services.txt
System.ServiceProcess.ServiceController
System.ServiceProcess.ServiceController
Azaz, ha ezeket használjuk, akkor mindenképpen érdemes egy Out-String átalakítással élni, mielőtt a tartalmat a fájlba írnánk:
PS C:\> Get-Service wu* | out-string | Set-Content C:\_myfiles\services.txt
PS C:\> Get-Content C:\_myfiles\services.txt
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update
Running wudfsvc Windows Driver Foundation - User-mo...
Itt természetesen bejön képbe az Out-String paraméterezési lehetősége, azaz a -Width beállításának a lehetősége, azaz a standard formázó PS1XML fájlokban megfogalmazott szabályoknak megfelelő formátumot nem a képernyő, hanem a –Width paraméternek megfelelően alakítja ki.
Megjegyzés
Érdemes megjegyezni, hogy az összes Out-… kezdetű cmdlet használja a PS1XML formázó szabályokat, azaz végeredményben sztringek lesznek a kimenetükön, míg a többi – például Add-Content, Set-Conent –, nem.
Az Add-/Set-Content esetében is meghatározhatjuk a szöveg kódolását, ami alaphelyzetben unicode. Ha választunk egy kódolást a fájlunk írásához, akkor nagyon javallott, hogy ha hozzáírunk, akkor is ugyanazzal a kódolással tegyük ezt, ellenkező esetben elég furcsa szervezésű fájlhoz fogunk jutni.
Nagyon hasznos a –Passthru paraméter az Add-/Set-Content párosnál! Ezzel tulajdonképpen hasonló funkciót lehet elérni, mint a Tee-Object -nél, csakhogy ott nincsen encoding megadására lehetőség, és a Tee-Object mindenképpen felülír, míg itt van lehetőségünk választani, hogy felülírunk vagy sem.
PS C:\> Get-Service app* | Out-String -stream | Add-Content C:\_myfiles\service
s.txt -PassThru | %{if($_ -match "Stopped"){ Write-Host $_ -ForegroundColor red
}else{write-host $_}}
Status Name DisplayName
------ ---- -----------
Stopped
AppIDSvc Application
Identity
Running Appinfo Application Information
Stopped
AppMgmt Application
Management
A fenti példában a korábbiakhoz hasonlóan kiírom az ’app’ kezdetű szolgáltatások listáját egy fájlba. Itt is használom az Out-String átalakítást, csakhogy itt soronként egy-egy külön sztringet képzek a –Stream kapcsolóval. A fájlba írás után még tovább nyomtam ezeket a sztringeket a csővezetéken, és ha van bennük „Stopped” szó, akkor pirossal, egyébként az alaphelyzet szerinti színnel írok ki a sorokat a képernyőre.
Az átirányítás operátorok (>, >>) hasonlóan működnek az előbb tárgyalt Set-/Add-Content pároshoz, azzal a különbséggel, hogy nincs –Passthru paraméterük és nem lehet kódolást meghatározni és eleve kevesebb lehetőséget biztosítanak számunkra, így ezek használatát én nem nagyon javaslom.
Az Out-File felfogható egy integrált Out-String | Add-/Set-Content párosként. Attól függően Add vagy Set, hogy használjuk-e az –Append kapcsolót vagy sem. Amúgy van neki –Encoding paraméter is, viszont nincs –Passthru, így mindjárt kiderül, hogy mikor is használható ez.