Alapértelmezés szerint a PowerShell parancsok kimenete (vagyis a kimenetként kapott objektumok szöveges reprezentációja) a konzolablakban jelenik meg. A szöveges kimenet fájlba irányítását az Out-File és a Set-Content cmdlet segítségével végezhetjük el, amelyek paramétereként a létrehozandó fájl nevét kell megadnunk. Az Export-Csv és az Export-CliXML cmdletek nevükhöz méltóan csv, illetve xml formátumban írják fájlba a bemenetül kapott objektumok adatait.
Példaként készítsünk szövegfájlt, csv és xml fájlt a c: meghajtó mappalistájából! A megoldás mindhárom esetben nagyon egyszerű, viszont az eredmény a formátumon túl, a további felhasználhatóság szempontjából is lényegesen különbözik egymástól.
PS C:\> Get-ChildItem | Out-File c:\dir.txt
Ebben az esetben a fájlba csak az kerül, amit az eredeti parancs a képernyőre írt volna. Ha a fájlt visszaolvassuk (Get-Content ), az eredeti kimenet sorainak megfelelő karakterláncokat kapunk.
A kimeneti fájlban - alaphelyzetben - 80 karakter szélességűre tördelt sorokat kapunk, ha ennél szélesebb sorokat szeretnénk, akkor használjuk a –width paramétert.
[27] PS C:\>Get-ChildItem c:\old | ft -property * -auto | Out-File c:\old\di
r2.txt -Width 800
A fenti példában a fájllistámat táblázatos formában akarom kirakni egy szöveges állományba, de az összes tulajdonsággal. Ez jó széles táblázatot eredményez, így az out-file-nál egy brutálisan széles sorméretet adok meg lehetséges értéknek. De hogy feleslegesen ne terpeszkedjen szét a táblázatom, ezért használtam a format-table cmdletnél az –auto kapcsolót, mert ez olyan sűrűn teszi az oszlopokat, amilyen sűrűn adatvesztés nélkül lehet. Így tehát kaptam egy optimális szélességű szöveget, amely ténylegesen csak 399 karakter széles lett, azaz nem kellett kihasználni a 800 karakteres maximumot.
Nézzük meg, hogy még milyen formátumokba tudjuk kitenni fájlba az outputot. A következő a csv formátum, ami táblázatos forma:
PS C:\> Get-ChildItem | Export-Csv c:\dir.csv
Ha belenézünk az eredményül kapott csv fájlba (Notepad, vagy Excel is jó), akkor örömmel láthatjuk, hogy ebben az esetben az objektumok minden tulajdonsága belekerült a kimenetbe, sőt a fejlécben még a típus megnevezése is megtalálható. Van egy Import-Csv cmdletünk is, ami a fájlt visszaolvasva újra létrehozza az eredeti objektumot, jobban mondva egy ahhoz hasonló objektumot. Próbáljuk is ki:
PS C:\> Import-Csv c:\dir.csv
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Config.Msi
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName : Config.Msi
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : True
Mode : d----
Az eredmény érdekesen néz ki, viszont sajnos nem hasonlít túlságosan az eredeti mappalistára. Egy Get-Member hívás segítségével megtudhatjuk, hogy mi is történt az adatainkkal:
PS C:\> Import-Csv c:\dir.csv | get-member
TypeName: CSV:System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
Equals Method System.Boolean Equals(Object obj)
GetHashCode Method System.Int32 GetHashCode()
GetType Method System.Type GetType()
ToString Method System.String ToString()
Attributes NoteProperty System.String Attributes=Directory
CreationTime NoteProperty System.String CreationTime=2006.11.15. 8...
CreationTimeUtc NoteProperty System.String CreationTimeUtc=2006.11.15...
Exists NoteProperty System.String Exists=True
Extension NoteProperty System.String Extension=
FullName NoteProperty System.String FullName=C:\752e9949d08195...
LastAccessTime NoteProperty System.String LastAccessTime=2007.07.06....
...
Látható, hogy nem az igazi DirectoryInfo típust kaptuk vissza (ráadásul a FileInfo típus teljesen eltűnt), hanem csak valamiféle pótlékot, az eredeti objektum leegyszerűsített változatát, amelynek nincsenek metódusai (csak amelyek az Object osztályból öröklődnek, ezekkel minden objektum rendelkezik), tulajdonságai pedig elvesztették eredeti típusukat. Minden tulajdonságérték megvan ugyan, de csak karakterláncként, az eredeti típusinformáció tárolására a csv formátum nem képes.
Ha kevesebb információvesztéssel szeretnénk tárolni és visszaolvasni objektumainkat, akkor az xml formátumot kell választanunk.
PS C:\> Get-ChildItem | Export-CliXML c:\dir.xml
Az xml fájl mérete közel tízszerese a csv-nek, de ebből pontosan az eredeti adathalmaz tulajdonságai olvashatók vissza, mindenféle veszteség, vagy torzulás nélkül. Ilyen módon tehát tetszőleges .NET objektum, gyűjtemény, akármi teljes tartalmát lemezre menthetjük, és később, a fájlt egyetlen paranccsal visszaolvasva helyreállíthatjuk az eredeti objektumot (a Mode oszlop azért hiányzik, mert az eredeti .NET objektumnak sincs ilyen tulajdonsága, ezt csak a PowerShell hazudja oda). Nem rossz!
PS C:\> Import-CliXML c:\dir.xml
Directory: Microsoft.PowerShell.Core\FileSystem::C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
2007.06.10. 12:41 Config.Msi
2007.06.13. 21:30 Documents and Settings
2003.10.25. 18:59 Inetpub
2007.06.04. 20:36 Program Files
Azért egy kis csalás itt is van. Ha megnézzük get-member-rel, hogy mit is kaptunk, akkor kiderül, hogy itt sem ugyanolyan objektumtípust kaptunk vissza, például a metódusokat ez is elveszítette:
[13] PS C:\old>import-clixml C:\dir.xml | gm
TypeName: Deserialized.System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
PSChildName NoteProperty System.String PSChildName=alfolder
PSDrive NoteProperty System.Management.Automation.PSObject PSD...
PSIsContainer NoteProperty System.Boolean PSIsContainer=True
PSParentPath NoteProperty System.String PSParentPath=Microsoft.Powe...
PSPath NoteProperty System.String PSPath=Microsoft.PowerShell...
PSProvider NoteProperty System.Management.Automation.PSObject PSP...
Attributes Property System.String {get;set;}
CreationTime Property System.DateTime {get;set;}
CreationTimeUtc Property System.DateTime {get;set;}
Exists Property System.Boolean {get;set;}
Extension Property System.String {get;set;}
FullName Property System.String {get;set;}
LastAccessTime Property System.DateTime {get;set;}
LastAccessTimeUtc Property System.DateTime {get;set;}
LastWriteTime Property System.DateTime {get;set;}
LastWriteTimeUtc Property System.DateTime {get;set;}
Name Property System.String {get;set;}
Parent Property System.String {get;set;}
Root Property System.String {get;set;}
TypeName: Deserialized.System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
PSChildName NoteProperty System.String PSChildName=alice.txt
PSDrive NoteProperty System.Management.Automation.PSObject PSD...
PSIsContainer NoteProperty System.Boolean PSIsContainer=False
PSParentPath NoteProperty System.String PSParentPath=Microsoft.Powe...
PSPath NoteProperty System.String PSPath=Microsoft.PowerShell...
PSProvider NoteProperty System.Management.Automation.PSObject PSP...
Attributes Property System.String {get;set;}
CreationTime Property System.DateTime {get;set;}
CreationTimeUtc Property System.DateTime {get;set;}
Directory Property System.String {get;set;}
DirectoryName Property System.String {get;set;}
Exists Property System.Boolean {get;set;}
Extension Property System.String {get;set;}
FullName Property System.String {get;set;}
IsReadOnly Property System.Boolean {get;set;}
LastAccessTime Property System.DateTime {get;set;}
LastAccessTimeUtc Property System.DateTime {get;set;}
LastWriteTime Property System.DateTime {get;set;}
LastWriteTimeUtc Property System.DateTime {get;set;}
Length Property System.Int64 {get;set;}
Name Property System.String {get;set;}
Azaz az Export-CliXML és Import-CliXML párossal az objektumot tulajdonságai megőrződnek, ugyanúgy felhasználhatjuk ezeket műveletek végzésére, mint az eredeti objektumok tulajdonságait, viszont a metódusok elvesztek, ha azokra is szükségünk lenne, akkor sajnos azon melegében, még exportálás előtt meg kell hívnunk ezeket.