Kiírás fájlba (Out-File, Export-)

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.



Word To HTML Converter