Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Nová parádní vychytávka v PowerShell 3 kterou soudruzi neudělali kompatibilní s PowerShell 2
srpen 17
Nová parádní vychytávka v PowerShell 3 kterou soudruzi neudělali kompatibilní s PowerShell 2

Dneska jsem narazil na pěknou věc. Obecná teorie tvrdí, že PowerShell 3.0 by měl být zpětně kompatibilní s PowerShell 2.0. Mělo by to znamenat, že co napíšete ve starší verzi, mělo by jet v pořádku v novější verzi. Jak jsem tu už psal, není tomu tak úplně vždycky (což se ostatně dalo čeka). Byť i například obsah proměnné $psVersionTable se snaží tvářit, že všechno by tak být mělo.

Dneska si můžete vyzkoušet příkaz switch a jeho problém při porovnávání konstantních hodnot typu [double], tedy desetinných čísel. Následující kód běží korektně v PowerShell 2.0, zatímco ve verzi 3.0 to vrací jiný výsledek. Zdá se, že PowerShell 3.0 konvertuje ty konstanty na řetězce a tím pádem to potom není schopen korektně porovnat.

PowerShell 2.0 se správným porovnáním:

$double = 5.3
$double.GetType()

switch ($double) {

  5.3 { echo 'prvni' }
  5.4 { echo 'druhy' }
  default { echo 'default' }

}

# result in PowerShell 2.0: prvni

PowerShell 3.0 s jiným výsledkem:

$double = 5.3
$double.GetType()

switch ($double) {

  5.3 { echo 'prvni' }
  5.4 { echo 'druhy' }
  default { echo 'default' }

}

# result in PowerShell 3.0: default

Existuje nějaká forma, která by to v obou verzích jazyka porovnala stejně a korektně? Například takto:

$double = 5.3
$double.GetType()

switch ($double) {

  { $_ -eq 5.3 } { echo 'prvni' ; break ; }
  { $_ -eq 5.4 } { echo 'druhy' ; break ; }
  default { echo 'default' }

}

# result in both PowerShell 2.0 and 3.0: prvni

Musíte si prostě to porovnávání udělat ručně sami pomocí [ScriptBlock], protože jak se zdá, trojka si to konvertuje špatně.

Comments

Powershell 4.0

V Powershell 4.0 už zase vraci spravnou hodnotu :-)
Petr Korecek on 18.8.2014 15:53

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments