Objektumok mentése, visszatöltése

A PowerShell lehetőséget biztosít objektumok elmentésére és visszatöltésére. Ez nagyon praktikus, hiszen ha épp a konzolon a változóim jól fel vannak töltve mindenféle objektummal és nekem valami miatt be kell csuknom a PowerShell ablakot, akkor a változóim törlődnek és legközelebb újra elő kellene állítanom őket.

Az Export-CliXML  cmdlettel ki tudom ezeket menteni egy fájlba, bezárhatom a PowerShell ablakot, majd később vissza tudom importálni a változóim értékét az Import‑CliXML  cmdlettel.

Nézzünk erre egy példát:

[13] PS C:\> $p = Get-Process w*

[14] PS C:\> $p

 

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

    123       7     2836       7924    74     0,09   2464 WindowsSearch

    655     159    10748       2976    97    11,77    440 winlogon

    700      49    40684      78780   280    50,63   2316 WINWORD

    215      12     4708       8584    79     0,11   2196 WLLoginProxy

    161       7     2704       7728    39     0,19   1812 wmiprvse

     30       3     1020       3088    50     0,02    504 wscntfy

 

 

[15] PS C:\> $p | get-member

 

 

   TypeName: System.Diagnostics.Process

 

Name                           MemberType     Definition

----                           ----------     ----------

Handles                        AliasProperty  Handles = Handlecount

Name                           AliasProperty  Name = ProcessName

NPM                            AliasProperty  NPM = NonpagedSystemMemorySize

PM                             AliasProperty  PM = PagedMemorySize

VM                             AliasProperty  VM = VirtualMemorySize

WS                             AliasProperty  WS = WorkingSet

add_Disposed                   Method         System.Void add_Disposed(Event...

...

 

[16] PS C:\> $p | Export-Clixml c:\export.xml

[17] PS C:\> Clear-Variable p

[18] PS C:\> $p

[19] PS C:\> $p = Import-Clixml C:\export.xml

[20] PS C:\> $p

 

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

    123       7     2836       7924    74     0,09   2464 WindowsSearch

    655     159    10748       2976    97    11,77    440 winlogon

    700      49    40684      78780   280    50,63   2316 WINWORD

    215      12     4708       8584    79     0,11   2196 WLLoginProxy

    161       7     2704       7728    39     0,19   1812 wmiprvse

     30       3     1020       3088    50     0,02    504 wscntfy

 

[21] PS C:\> $p | get-member

 

 

   TypeName: Deserialized.System.Diagnostics.Process

 

Name                       MemberType     Definition

----                       ----------     ----------

Handles                    AliasProperty  Handles = Handlecount

Name                       AliasProperty  Name = ProcessName

NPM                        AliasProperty  NPM = NonpagedSystemMemorySize

PM                         AliasProperty  PM = PagedMemorySize

VM                         AliasProperty  VM = VirtualMemorySize

WS                         AliasProperty  WS = WorkingSet

__NounName                 NoteProperty   System.String __NounName=Process

BasePriority               Property       System.Int32 {get;set;}

Container                  Property        {get;set;}

EnableRaisingEvents        Property       System.Boolean {get;set;}

...

A fenti példában a $p változó megkapta a W-vel kezdődő processz-objektumok tömbjét. A [15]-ben látszik, hogy ez tényleg jól nevelt System.Diagnostics.Process objektumokat tartalmaz, a rájuk jellemző tulajdonságokkal és metódusokkal együtt.

Ezután kiexportáltam $p-t, töröltem majd visszaimportáltam. [20]-ban megnézem, mi van $p-ben, szemre teljesen ugyanaz, mint korábban. Azonban a [21] get-member-je felfedi, hogy azért ez mégsem 100%-osan ugyanaz az objektum, hiszen elveszítette a metódusait és típusa is más lett:

Deserialized.System.Diagnostics.Process.

Mindenesetre, ha a statikus adataival szeretnénk csak foglalkozni ez bőven elég, éles, „real time” adatokkal meg úgysem biztos, hogy tudnánk dolgozni, hiszen az export óta lehet, hogy megszűntek már a korábban futó processzek.

Van egy bosszantó jelenség (hiba?) a hashtáblák exportjával-importjával kapcsolatban. Ugye emlékszünk még arra, hogy a hashtáblákban a kulcsokra hivatkozás kis-nagybetű érzéketlen. Azaz:

[1] PS C:\> $h = @{first = "bla";second="haliho"}

[2] PS C:\> $h.first

bla

[3] PS C:\> $h.FIRST

Bla

A fenti példában mindegy, hogy hogyan hivatkoztunk a ’first’ nevű elemre. Ezzel szemben nézzük, hogy mi történik, ha exportáljuk, majd importáljuk ezt a hashtáblát:

[4] PS C:\> Export-Clixml -Path C:\ee\hash.xml -InputObject $h

[5] PS C:\> $g = Import-Clixml -Path C:\ee\hash.xml

[6] PS C:\> $g.first

bla

[7] PS C:\> $g.FIRST

[8] PS C:\>

Láthatjuk, hogy a nagybetűs „FIRST”-re nem kaptunk semmit, azaz az eredetileg kis-nagybetű érzéketlen hashtáblából érzékeny lett. Hogyan lehet ezt visszaalakítani? Ehhez fel tudjuk használni a PowerShell balról jobbra való automatikus típuskonverzióját a következőképpen:

[8] PS C:\> $g = @{} + (Import-Clixml -Path C:\ee\hash.xml)

[9] PS C:\> $g.first

bla

[10] PS C:\> $h.FIRST

bla

Ezzel már jól működik, az üres, ámde kis-nagybetű érzéketlen hashtáblához igazítja az érzékeny verziót, viszont az összeadás tartalmilag nem változtatta az eredményt.



Word To HTML Converter