Powershell lent à démarrer?

Celui qui n'a jamais utilisé Powershell ne peut pas comprendre le but de ce post !

En effet, peut importe la puissance de la machine sur laquelle vous travaillez, powershell est lent à démarrer … c'est un fait et j'avoue que ca m'agace à chaque fois que je veux lancer mes scripts. J'ai été rassuré il y a peu car je ne suis pas le seul à trouver ce temps d'attente pénible et l'équipe powershell a écrit un post sur le sujet : https://blogs.msdn.com/powershell/archive/2008/07/11/speeding-up-powershell-startup.aspx

Je n'avais pas eu le temps de le lire jusqu'à présent mais c'est chose faite et je vous invite vraiment à le lire et éventuellement effectuer les modifications qui y sont proposées (à tester avant de le faire en production bien entendu !).

En substance, Jeffrey dit que dans la v1 de powershell, un bug dans la procédure d'installation ne transformait pas le code managé en code natif. C'est ce que dans le jargon des développeurs on appelle être "ngen'ed" :). En quelques mots, l'outil "ngen" permet de créer des images contenant du code compilé spécifiquement pour l'environnement de la machine et les mets dans le cache de l'ordinateur. Pour en savoir plus sur ngen allez sur : https://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx

Pour palier à cette défaillance, Jeffey et son équipe ont publié le script qui va bien pour corriger ce problème à postériori ! Il est disponible ici : https://blogs.msdn.com/powershell/archive/2007/11/08/update-gac-ps1.aspx. C'est presque simplissime :

Set-Alias ngen @(
dir (join-path ${env:\windir} "Microsoft.NET\Framework") ngen.exe -recurse |
sort -descending lastwritetime
)[0].fullName
[appdomain]::currentdomain.getassemblies() | %{ngen $_.location}

Il suffit donc de copier ce code dans un fichier, par exemple update-gac.ps1 et de le lancer. Croisez les doigts et c'est prêt !

Attention, il faut le faire à chaque installation de Powershell ou d'un serveur Exchange 2007.