Zrovna včera jsem tu psal o problému, který mají Exchange, SharePoint, System Center, UAG a další s novým PowerShell 3.0. Já jsem napsal za poslední rok cca 11 000 řádků PowerShell kódu a neměl jsem s přechodem skoro žádné problémy. Prostě jsem svoje starší kódy spustil na verzi 3.0 a šlapou jako hodinky.
Rozhodně je ale moje zkušenost tato - pokud to jede ve verzi PowerShell 2.0, tak to jede spolehlivě na PowerShell 3.0 taky. To byl zřejmě i cíl pánů vývojářů, protože novinky jsou přidávány jen velmi citlivě. Ano, některé věci, které jdou v PowerShell 3.0, samozřejmě nepojedou ve starší verzi, ale opačně mi to prozatím žádné problémy nedělalo.
Tak co tam sakra může mít ten Exchange za problém? Menší průzkum objevil třeba toto:
function Vracej-Cislo ()
{
try {
Write-Host 'Tohle jenom vraci cislo'
}
finally {
return 17
}
}
Vracej-Cislo
Přechozí skriptík funguje úplně v pohodě na PowerShell 2.0, zatímco v nové verzi dostanete chybovou hlášku Control cannot leave a finally block:
At line:7 char:5
+ return 17
+ ~~~~~~~~~
Control cannot leave a finally block.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ControlLeavingFinally
Zkoušení
Kdybyste to potřebovali vyzkoušet, ani nemusíte shánět stroj s Windows 7, nebo Windows 2008 R2. Pokud máte "jen" PowerShell 3.0, můžete si spustit i starší verzi. Na to je parametr -version. Zkontrolovat to můžete vzápětí pomocí Get-Host
powershell -version 2.0
get-host
Tak pozor. Není to vždycky tak hladce kompatibilní, jak by se mohlo na první pohled zdát.
Aktualizace: Další podobnou "chybku" má například příkaz switch.