Delen via


Ontwerpoverwegingen voor PowerShell-modules

Dit document bevat enkele richtlijnen met betrekking tot de wijze waarop een module is gemaakt voor de beste prestaties.

Ontwerp van modulemanifest

Een modulemanifest dat niet gebruikmaakt van de volgende richtlijnen kan een merkbare invloed hebben op de algemene PowerShell-prestaties, zelfs als de module niet in een sessie wordt gebruikt.

Met automatische detectie van opdrachten wordt elke module geanalyseerd om te bepalen welke opdrachten de module exporteert en deze analyse duur kan zijn. De resultaten van moduleanalyse worden per gebruiker in de cache opgeslagen, maar de cache is niet beschikbaar bij de eerste uitvoering. Dit is een typisch scenario met containers. Als tijdens de moduleanalyse de geëxporteerde opdrachten volledig kunnen worden bepaald vanuit het manifest, kan duurdere analyse van de module worden vermeden.

Richtlijnen

  • Gebruik in het modulemanifest geen jokertekens in de AliasesToExporten CmdletsToExportFunctionsToExport vermeldingen.

  • Als de module geen opdrachten van een bepaald type exporteert, geeft u dit expliciet op in het manifest door op te @()geven. Een ontbrekend item of $null item is gelijk aan het opgeven van het jokerteken *.

Het volgende moet waar mogelijk worden vermeden:

@{
    FunctionsToExport = '*'

    # Also avoid omitting an entry, it's equivalent to using a wildcard
    # CmdletsToExport = '*'
    # AliasesToExport = '*'
}

Gebruik in plaats daarvan:

@{
    FunctionsToExport = 'Format-Hex', 'Format-Octal'
    CmdletsToExport = @()  # Specify an empty array, not $null
    AliasesToExport = @()  # Also ensure all three entries are present
}

CDXML vermijden

Wanneer u besluit hoe u uw module implementeert, zijn er drie primaire opties:

  • Binair (meestal C#)
  • Script (PowerShell)
  • CDXML (een XML-bestand wrapping CIM)

Als de snelheid van het laden van uw module belangrijk is, is CDXML ongeveer een orde van grootte langzamer dan een binaire module.

Een binaire module laadt het snelst omdat deze van tevoren is gecompileerd en NGen kan gebruiken om JIT één keer per machine te compileren.

Een scriptmodule laadt doorgaans iets langzamer dan een binaire module, omdat PowerShell het script moet parseren voordat het wordt geparseerd en uitgevoerd.

Een CDXML-module is doorgaans veel langzamer dan een scriptmodule, omdat het eerst een XML-bestand moet parseren dat vervolgens een behoorlijk aantal PowerShell-scripts genereert die vervolgens worden geparseerd en gecompileerd.