Típuskonverzió

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).



Word To HTML Converter