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.