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

Sorry comments are disable due to the constant load of spam *


Omlouvám se, ale příval spamu nelze kontrolovat, takže mi prosím pošlete email, pokud máte nějaký dotaz, nebo připomínku.

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 *


Email


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

Attachments