Előzőekben mutattam, hogy a PowerShell a kifejezésekben megpróbálja a triviális típuskonverziókat elvégezni, olyan típusúvá próbálja konvertálni a tagokat, amely nem jár információveszteséggel.
Ha mi magunk akarunk típuskonverziót elvégezni és nem a PowerShell automatizmusára bízni a kérdést, akkor erre is van lehetőség:
[1] PS C:\> $a = "1234"
[2] PS C:\> $b = [int] $a
[3] PS C:\> $b.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
[4] PS C:\> $c = 4321
[5] PS C:\> $d = [string] $c
[6] PS C:\> $d.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Ennél trükkösebb dolgokat is lehet típuskonverzió segítségével elvégezni. Például az Exchange Server 2007-ben van egy „rejtélyes” karaktersorozat az Administrative Group objektumnál. Próbáljuk ezt megfejteni típuskonverzió segítségével. Elsőként alakítsuk át a sztringet karaktertömbbé:
[10] PS C:\> $s = "FYDIBOHF23SPDLT"
[11] PS C:\> [char[]] $s
F
Y
D
I
B
O
H
F
2
3
S
P
D
L
T
Majd ebből csináljunk egy egésztömböt, amely a karakterkódokat tartalmazza:
[12] PS C:\> [int[]][char[]] $s
70
89
68
73
66
79
72
70
50
51
83
80
68
76
84
Majd ezt a számsort töltsük bele egy csővezetékbe és vonjunk ki minden eleméből egyet:
[13] PS C:\> [int[]][char[]] $s | ForEach-Object{$_ -1}
69
88
67
72
65
78
71
69
49
50
82
79
67
75
83
Az így megkapott számsort alakítsuk vissza karaktersorozattá:
[14] PS C:\> [char[]]([int[]][char[]] $s | ForEach-Object{$_ -1})
E
X
C
H
A
N
G
E
1
2
R
O
C
K
S
Itt már az éles szeműek felismerik a megoldást, a többieknek segítsünk azzal, hogy a karaktersorozatból sztringet gyúrunk össze:
[15] PS C:\> [string][char[]]([int[]][char[]] $s | ForEach-Object{$_ -1})
E X C H A N G E 1 2 R O C K S
Ez majdnem tökéletes, azzal a különbséggel, hogy felesleges a sok szóköz.
Megjegyzés
Alaphelyzetben a PowerShell, amikor egy karaktertömbből sztringet rak
össze, akkor az összefűzött elemek közé egy szóközt tesz elválasztó
karakterként. De szerencsére ez testre szabható a gyári $ofs
változóval, ami az Output
Field Separator. Ha ennek a változónak adunk egy
üres sztring értéket (””),
akkor ez pont célra vezet:
[16] PS C:\> $ofs=""
[17] PS C:\> [string][char[]]([int[]][char[]] $s | ForEach-Object{$_-1})
EXCHANGE12ROCKS
Az $ofs változó – ellentétben a többi, „igazi” automatikus változóval – alaphelyzetben nem létezik. Ha létrehozzuk, akkor a benne tárolt sztring lesz az elválasztó karakter.
Még a dátum típussal kapcsolatban szoktunk gyakran típuskonverziót végezni. Például szeretnék készíteni egy olyan függvényt, ami kiszámolja, hogy hány nap van még a születésnapomig:
[9] PS I:\>function szülinap ([string] $mikor)
>> {
>> ([datetime] ([string]((get-date).Year) + "-$mikor") - (get-date)).Days
>> }
>>
[10] PS I:\>szülinap "10-14"
178
A függvény működése: sztring formátumban beírom a születési hó, nap értékét kötőjelesen (10-14), ehhez az aktuális dátum (Get-Date) sztringgé alakított évszám részét hozzátoldom, ebből az új, teljes dátumot kiadó sztringből csinálok egy dátumot [datetime], ebből a dátumból kivonom az aktuális dátumot, majd ennek az egésznek veszem a napokban kifejezett értékét (.Days).