2010-05-12 6 views
2

Je cours un certain nombre de scripts en utilisant PowerShell V2, et j'ai remarqué une longue pause lorsque la fenêtre de la console se charge d'abord. Que puis-je faire pour améliorer les performances de mes scripts?Accélérer les scripts PowerShell dans V2?

Merci, MagicAndi

Répondre

7

Autre que minimisez ce que vous mettez dans vos différents scripts de profil (ci-dessous) il n'y a pas grand-chose que vous pouvez faire:

C:\PS> $profile | fl * -force 


AllUsersAllHosts  : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1 
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 
CurrentUserAllHosts : C:\Users\hillr\Documents\WindowsPowerShell\profile.ps1 
CurrentUserCurrentHost : C:\Users\hillr\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 

Une façon de vérifier si le profil Les scripts provoquent le décalage est de démarrer powershell en utilisant l'option -noprofile. Si le temps de démarrage est différent, cela serait dû à vos scripts de profil. Vous pouvez utiliser un chronomètre .NET comme ceci:

function TimeThis([scriptblock]$scriptblock, $msg) 
{ 
    if (!$stopWatch) 
    { 
     $script:stopWatch = new-object System.Diagnostics.StopWatch 
    } 
    $stopWatch.Reset() 
    $stopWatch.Start() 
    . $scriptblock 
    $stopWatch.Stop() 
    if ($msg -eq $null) { $msg = "$scriptblock" } 
    "Execution time: $($stopWatch.ElapsedMilliseconds) mS for $msg" 
} 

. TimeThis {Import-Module $Module -args ~\Pscx.UserPreferences.ps1} 

Alors que vous pouvez utiliser Measure-Command, il ne montre pas ce qui est exécuté et vous obtenez pas de sortie de commande (uniquement de temps de façon très bavard).

Il y avait un problème dans les CTP antérieurs où le programme d'installation n'enchaînait pas les assemblages PowerShell et pouvait causer des retards de chargement notables. Cependant, je suis à peu près sûr que cela a été corrigé à partir de l'installation 2.0 finale (et certainement avec PowerShell intégré dans Windows 7 et Windows Server 2008 R2). Si le répertoire de suivi et son contenu existent, vous devriez ngen'd:

dir 'C:\Windows\assembly\NativeImages_v2.0.50727_32\Microsoft.PowerShel#' -r 
+0

Keith, accepté comme réponse. Désolé pour le retard! – MagicAndi

+0

Y at-il un moyen de charger les modules ngen par le profil? Comme PowerTab et PS Community Extensions? –

+0

Oui mais manuellement. Trouvez les DLLs requises par les modules que vous chargez et exécutez ngen.exe sur celles-ci. Utilisez ngen.exe à partir du répertoire d'infrastructure 2.0, par exemple. 'C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727'. –

3

Traquer un problème de performance, comme cela peut être difficile, mais il y a quelques choses que vous pouvez faire pour améliorer/choses fixes.

Tout d'abord, démarrage PowerShell froid contre chaud. Au moins sur mon poste de travail, la première fois que je cours PS le matin, il faut un peu plus de temps pour lancer que les temps suivants. Y a-t-il un moyen de le garder au chaud pour minimiser les temps de chargement?

Deuxièmement, utilisez un outil comme Process Monitor des gens fins travaillant pour Windows Sysinternals. Réglez-le pour surveiller le processus powershell.exe et voir ce qu'il fait qui prend si longtemps. Pour moi, j'ai un certain nombre de lecteurs réseau mappés et de scripts partagés qui proviennent du réseau. Lors de mes tests, j'ai mesuré environ deux secondes de retard sur le démarrage par script à distance que je chargeais.

PowerShell a besoin de charger un tas de ressources à partir du disque dans la mémoire, donc il va sans dire que le fait d'avoir votre système d'E/S fonctionner de manière optimale aidera également. Defrag, assurez-vous que vous avez amplement de RAM libre, etc. Il interroge même pas mal du registre, alors vous pouvez vouloir vous assurer que votre registry is completely defragged - bien que ce soit assez long.

+0

Goyuix, merci de souligner les différents domaines à étudier. +1 – MagicAndi

0

Il peut être complètement indépendant mais j'ai déjà eu une pause massive pendant le démarrage de powershell.

Il était en quelque sorte lié au fait que mon ordinateur portable était dans un domaine, je l'ai ensuite mis en veille et l'ai redémarré lorsque l'ordinateur portable n'était plus dans le domaine. J'ai regardé le démarrage avec dottrace et ne pouvais voir que quelque part dans l'initialisation des fournisseurs le code s'est coincé.

Redémarrage de la machine aidé dans ce cas. En outre, cela ne se produit pas toujours (en fait, une seule fois jusqu'à présent).

0

utilisation en ligne C# speedup x100 max

Add-type -Langue CSharpVersion3 @ "

"@

@ Add-type"

" @

si ne peut pas utiliser -TypeDefinition @ »

utiliser 32bit powershell

x1,5 speedup

ps-run.cmd:

SET PS32 =% windir% \ SysWOW64 \ WindowsPowerShell \ v1.0 \ Powershell

% PS32%. \% *

Questions connexes