Hoe trage opstarttijden voor de PowerShell-console en -scripts te verhelpen

Het probleem van trage PowerShell-opstarttijden is vrij algemeen, vooral op sommige systemen waar het een eeuwigheid lijkt te duren voordat een terminalvenster geopend is. Soms komt dit doordat profielbestanden een heleboel aangepaste functies of modules proberen te laden, of doordat bepaalde modules traag initialiseren. Dit kan de uitvoering van scripts en aanmeldscripts enorm vertragen. En omdat Windows de zaken vaak onnodig ingewikkeld maakt, duiken deze vertragingen op verschillende machines op zonder duidelijke oorzaak, waardoor gebruikers zich afvragen wat er aan de hand is. Het goede nieuws? Er zijn tal van tweaks en controles die de boel kunnen versnellen, waardoor PowerShell sneller en soepeler opstart, of je het nu even snel opent voor een controle of een script uitvoert in een geplande taak.

Hoe los je het probleem op dat PowerShell traag opstart?

Methode 1: Meet de opstarttijd om te achterhalen wat te langzaam laadt.

Dit is handig omdat het een duidelijk beeld geeft van wat de vertraging zou kunnen veroorzaken: profielen, modules of iets anders. Zonder een basislijn weet je niet wat je moet aanpassen. Met Measure-Command kun je controleren hoe lang PowerShell erover doet om op te starten en een eenvoudige opdracht uit te voeren, zodat je de opstartsnelheden in verschillende configuraties kunt vergelijken.

Voer dit uit in een PowerShell-venster:

powershell -noprofile -ExecutionPolicy Bypass ( Measure-Command { powershell "Write-Host 1" } ).TotalSeconds

Dit meet hoe lang het duurt om PowerShell te starten en een snel commando uit te voeren zonder profielen te laden. Op sommige systemen kunnen laadtijden van meer dan 10 seconden voorkomen, wat veel te lang is. In dat geval kan het profileren van opstartprofielen trage commando’s of zware modules aan het licht brengen die alles vertragen.

Methode 2: Profielen overslaan om de basislijn te controleren

Profielen kunnen verraderlijk zijn; soms bevatten ze trage commando’s of laden ze grote modules. Door PowerShell te starten met -noprofile worden deze volledig overgeslagen, waardoor het meestal *veel* sneller gaat. Dit is handig om te controleren of profielen de vertraging veroorzaken of om gewoon even te wennen aan een snellere start.

Loop:

powershell.exe -noprofile

of voor PowerShell Core:

pwsh.exe -noProfile

Als dit de snelheid aanzienlijk verbetert, is het controleren van je profielbestanden de volgende stap. Controleer welke profielbestanden zijn ingesteld om te laden met:

$profile | select *

Controleer vervolgens handmatig deze bestanden op zware commando’s of onnodige moduleladingen. Soms probeert het gebruikersprofielscript tientallen modules te laden of trage commando’s uit te voeren, wat niet bevorderlijk is voor de prestaties. Het verwijderen of optimaliseren van deze scripts kan de opstarttijden aanzienlijk verkorten.

Methode 3: Beperk modules en optimaliseer uw PowerShell-omgeving

Het automatisch laden van modules in PowerShell kan de boel vertragen als je veel modules hebt geïnstalleerd. Om te controleren welke modules geïnstalleerd en geladen zijn, voer je het volgende commando uit:

$Env:PSModulePath -split ';'

Dit toont de paden waar modules zijn opgeslagen. Om beschikbare modules te bekijken en te controleren wat er daadwerkelijk is geladen, probeer het volgende:

Get-Module -ListAvailable

Om vervolgens alle geïnstalleerde modules te bekijken, inclusief modules van derden:

Get-InstalledModule

Als er modules zijn die u nooit gebruikt, verwijder ze dan:

Remove-Module -Name ModuleName; Uninstall-Module -Name ModuleName -AllVersions -Force

Pro-tip: Je kunt ook controleren hoe lang het laden van elke module duurt door deze expliciet te importeren en de laadtijd te meten.

Measure-Command { Import-Module ModuleName -Force }

En nog beter, om alle geïnstalleerde modules snel te analyseren:

 $modules = Get-InstalledModule | Select-Object -ExpandProperty Name -Unique foreach ($mod in $modules) { $time = Measure-Command { Import-Module $mod -Force } [PSCustomObject]@{ Module = $mod LoadTimeSec = $time. TotalSeconds } } 

Modules die langer dan een seconde of twee nodig hebben om op te starten, kunt u het beste uitschakelen. Om te voorkomen dat modules automatisch worden geladen, voegt u de volgende regel toe aan uw profiel:

$PSModuleAutoLoadingPreference = 'None'

Je kunt modules vervolgens handmatig laden wanneer dat nodig is met:

Import-Module ModuleName

Dit zorgt ervoor dat de startup compacter blijft, vooral als je met een heleboel modules werkt die niet elke sessie nodig zijn.

Methode 4: Omgaan met bekende trage modules (zoals VMware PowerCLI)

Sommige modules, met name VMware PowerCLI, kunnen minutenlang blijven hangen als uw computer externe certificaten niet kan verifiëren, bijvoorbeeld als u offline bent of als de firewall de CRL-controles blokkeert. Het uitschakelen van CRL-controles in Windows kan helpen:

reg add HKLM\SYSTEM\CurrentControlSet\Services\SstpSvc\Parameters /v NoCertRevocationCheck /t REG_DWORD /d 0x00000001 /f

Of schakel de controle op intrekking van certificaten uit in Internet Explorer/Opties onder Geavanceerd. Want Windows moet het natuurlijk altijd ingewikkelder maken dan nodig is.

Methode 5: Controleer op interferentie van de antivirussoftware

Dit is een lastige truc. Antivirusprogramma’s, met name die voor grote bedrijven of bepaalde beveiligingssuites, scannen vaak DLL’s of monitoren processen intensief tijdens het opstarten, waardoor PowerShell trager opstart. Om dit te testen, kunt u snel controleren welke modules geladen worden wanneer PowerShell start:

  1. Open cmd.exe en voer het volgende commando uit:
    powershell.exe -c "Write-Host $PID;Start-Sleep -s 60"
  2. Kopieer de weergegeven ^PID^ en voer deze vervolgens uit in een nieuw PowerShell-venster:
    Get-Process | where {$_. Id -eq <YOUR_PID>} | select -ExpandProperty modules
  3. Zoek naar antivirus- of beveiligings-DLL’s. Als die aanwezig zijn, probeer dan PowerShell-uitvoerbare bestanden toe te voegen aan de witte lijst in de instellingen van uw antivirusprogramma.

Voor Windows Defender kunt u uitzonderingen toevoegen met:

Add-MpPreference -ExclusionProcess "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe", "C:\Program Files\PowerShell\7\pwsh.exe"

Hopelijk voorkomt dat dat antivirusprogramma’s de opstarttijden verstoren.

Methode 6: Aan de slag met. NET Framework en PowerShell Native Image Generation (NGen)

Als trage aanroepen van. NET-bibliotheken de oorzaak zijn, kunt u ngen.exe (Native Image Generator) op uw assemblies uitvoeren. Dit compileert assemblies naar native code, waardoor ze sneller laden. Het is iets meer werk, maar de moeite waard als u echt geen andere keuze hebt.

$env:PATH = [Runtime. InteropServices. RuntimeEnvironment]::GetRuntimeDirectory() [AppDomain]::CurrentDomain. GetAssemblies() | ForEach-Object { $path = $_. Location if ($path) { $name = Split-Path $path -Leaf Write-Host "Running ngen on '$name'" -ForegroundColor Yellow & ngen install $path /nologo } }

Let op: Voer dit uit met beheerdersrechten en maak eerst een back-up. Het is niet waterdicht, maar op sommige systemen verkort het de opstarttijd aanzienlijk.

En als niets anders werkt…

Hier komt Process Monitor van Sysinternals goed van pas. Je kunt filters instellen voor powershell.exe en zien wat de opstart blokkeert. Misschien blijft een DLL of registeraanroep hangen, of merk je trage netwerkcontroles op. Soms kan het ook helpen om het PowerShell-geschiedenisbestand (dat op sommige systemen enorm groot kan worden) te verwijderen – verwijder het ConsoleHost_history.txtbestand in je AppData-map.

Over het algemeen is het niet altijd één ding dat de oorzaak is. Soms zijn het profielen, modules of zelfs antivirussoftware. Maar het uitvoeren van deze controles en optimalisaties helpt meestal wel. Want Windows moet het natuurlijk altijd ingewikkelder maken dan nodig is – ga er maar aan staan.

Samenvatting

  • Meet de opstarttijd om Measure-Commandknelpunten te vinden.
  • Sla profielen over om de basisprestaties te controleren.
  • Controleer en verminder het aantal geladen modules.
  • Schakel CRL-controles uit als modules zoals PowerCLI traag laden.
  • Door PowerShell toe te voegen aan de whitelist van antivirussoftware worden vertragingen voorkomen.
  • Overweeg om ngen.exe te gebruiken om. NET-assemblies vooraf te compileren indien nodig.
  • Gebruik Process Monitor voor een gedetailleerde opstartanalyse.

Samenvatting

Hopelijk helpen deze tips om de boel wat te versnellen. Het is best lastig om te achterhalen wat PowerShell vertraagt, maar als je het eenmaal doorhebt, is het meestal wel op te lossen. Meestal zijn profielen of modules de boosdoeners. Houd er wel rekening mee dat het in sommige configuraties een combinatie van al deze factoren kan zijn. Succes, en hopelijk helpt dit iemand om de opstarttijd te verkorten!