Delen via


about_PowerShell_Editions

Korte beschrijving

Verschillende edities van PowerShell worden uitgevoerd op verschillende onderliggende runtimes.

Lange beschrijving

Vanuit PowerShell 5.1 zijn er meerdere editions van PowerShell die elk worden uitgevoerd op een andere .NET runtime. Vanaf PowerShell 6.0 zijn er twee edities van PowerShell:

  • Desktop, dat wordt uitgevoerd op .NET Framework. PowerShell 4 en lager, evenals PowerShell 5.1 zijn beschikbaar voor volledige Windows-edities zoals Windows Desktop, Windows Server, Windows Server Core en de meeste andere Windows besturingssystemen. Dit is de oorspronkelijke PowerShell-editie en is opgenomen in de standaardinstallatie van het besturingssysteem.
  • Core, dat wordt uitgevoerd op .NET Core. PowerShell 6.0 en hoger wordt naast eerdere PowerShell-releases geïnstalleerd op volledige Windows-edities, een aantal edities met beperkte footprint Windows, zoals Windows Nano Server en Windows IoT, of op niet-Windows platforms zoals Linux en macOS.

Omdat de editie van PowerShell overeenkomt met de .NET runtime, is dit de primaire indicator van .NET API- en PowerShell-modulecompatibiliteit. Sommige .NET API's, typen of methoden zijn niet beschikbaar in zowel .NET runtimes als dit van invloed is op PowerShell-scripts en -modules die hiervan afhankelijk zijn.

De $PSEdition automatische variabele

In PowerShell 5.1 en hoger kunt u zien welke editie u uitvoert met de $PSEdition automatische variabele:

$PSEdition
Core

In PowerShell 4 en lager bestaat deze variabele niet. $PSEdition null moet worden behandeld als hetzelfde als het hebben van de waarde Desktop.

Editie in $PSVersionTable

De $PSVersionTable automatische variabele heeft ook eigenschap PSEdition in PowerShell 5.1 en hoger:

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.3.9
PSEdition                      Core
GitCommitId                    7.3.9
OS                             Microsoft Windows 10.0.22621
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Het veld PSEdition heeft dezelfde waarde als de automatische variabele $PSEdition.

Het CompatiblePSEditions manifestveld van de module

PowerShell-modules kunnen aangeven met welke edities van PowerShell ze compatibel zijn met het CompatiblePSEditions veld van het modulemanifest.

Een modulemanifest dat bijvoorbeeld compatibiliteit declareren met zowel Desktop als Core edities van PowerShell:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop', 'Core')
}

Een voorbeeld van een modulemanifest met alleen Desktop compatibiliteit:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop')
}

Het weglaten van het CompatiblePSEditions veld uit een modulemanifest heeft hetzelfde effect als het instellen op Desktop, omdat modules die zijn gemaakt voordat dit veld werd geïntroduceerd impliciet zijn geschreven voor deze editie.

Voor modules die niet worden verzonden als onderdeel van Windows (d.w.w. modules die u schrijft of installeert vanuit de galerie), is dit veld alleen informatief; PowerShell wijzigt het gedrag niet op basis van het veld CompatiblePSEditions, maar maakt dit wel beschikbaar op het object PSModuleInfo (geretourneerd door Get-Module) voor uw eigen logica:

$newModuleManifestSplat = @{
    Path = '.\TestModuleWithEdition.psd1'
    CompatiblePSEditions = 'Desktop', 'Core'
    PowerShellVersion = '5.1'
}
New-ModuleManifest @newModuleManifestSplat
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core

Notitie

Het veld CompatiblePSEditions module is alleen compatibel met PowerShell 5.1 en hoger. Als u dit veld opneemt, is een module niet compatibel met PowerShell 4 en lager. Omdat het veld puur informatief is, kan het veilig worden weggelaten in latere PowerShell-versies.

In PowerShell 6.1 heeft Get-Module -ListAvailable de formatter bijgewerkt om de editiecompatibiliteit van elke module weer te geven:

Get-Module -ListAvailable

    Directory: C:\Users\me\Documents\PowerShell\Modules

ModuleType Version    Name                   PSEdition ExportedCommands
---------- -------    ----                   --------- ----------------
Script     1.4.0      Az                     Core,Desk
Script     1.3.1      Az.Accounts            Core,Desk {Disable-AzDataCollection, Disable-AzContextAutosave, E...
Script     1.0.1      Az.Aks                 Core,Desk {Get-AzAks, New-AzAks, Remove-AzAks, Import-AzAksCreden...

...

Script     4.4.0      Pester                 Desk      {Describe, Context, It, Should...}
Script     1.18.0     PSScriptAnalyzer       Desk      {Get-ScriptAnalyzerRule, Invoke-ScriptAnalyzer, Invoke-...
Script     1.0.0      WindowsCompatibility   Core      {Initialize-WinSession, Add-WinFunction, Invoke-WinComm...

Editiecompatibiliteit voor modules die worden verzonden als onderdeel van Windows

Voor modules die deel uitmaken van Windows (of zijn geïnstalleerd als onderdeel van een functie of functie), behandelt PowerShell 6.1 en hoger het veld CompatiblePSEditions anders. Dergelijke modules vindt u in de map Windows PowerShell-systeemmodules (%windir%\System\WindowsPowerShell\v1.0\Modules).

Voor modules die zijn geladen uit of gevonden in deze map, gebruikt PowerShell 6.1 en hoger het CompatiblePSEditions veld om te bepalen of de module compatibel is met de huidige sessie en zich dienovereenkomstig gedraagt.

Wanneer Import-Module wordt gebruikt, wordt een module zonder Core in CompatiblePSEditions niet geïmporteerd en wordt er een fout weergegeven:

Import-Module BitsTransfer
Import-Module : Module 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\BitsTransfer\BitsTransfer.psd1'
 does not support current PowerShell edition 'Core'. Its supported editions are 'Desktop'. Use 'Import-Module
 -SkipEditionCheck' to ignore the compatibility of this module.
At line:1 char:1
+ Import-Module BitsTransfer
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (C:\WINDOWS\system32\u2026r\BitsTransfer.psd1:String)
 [Import-Module], InvalidOperationException
+ FullyQualifiedErrorId : Modules_PSEditionNotSupported,Microsoft.PowerShell.Commands.ImportModuleCommand

Wanneer Get-Module -ListAvailable wordt gebruikt, worden modules zonder Core in CompatiblePSEditions niet weergegeven:

Get-Module -ListAvailable BitsTransfer
# No output

In beide gevallen kan de -SkipEditionCheck[switch] parameter worden gebruikt om dit gedrag te overschrijven:

Get-Module -ListAvailable -SkipEditionCheck BitsTransfer

    Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

ModuleType Version    Name           PSEdition ExportedCommands
---------- -------    ----           --------- ----------------
Manifest   2.0.0.0    BitsTransfer   Desk      {Add-BitsFile, Complete-BitsTransfer, Get-BitsTransfer,...

Waarschuwing

Import-Module -SkipEditionCheck kan slagen voor een module, maar het gebruik van die module loopt het risico dat er later sprake is van incompatibiliteit; tijdens het laden van de module in eerste instantie slaagt, kan een opdracht later een incompatibele API aanroepen en spontaan mislukken.

PowerShell-modules ontwerpen voor kruiscompatibiliteit voor edities

Wanneer u een PowerShell-module schrijft om zowel Desktop als Core edities van PowerShell te richten, zijn er dingen die u kunt doen om compatibiliteit tussen edities te garanderen.

De enige echte manier om compatibiliteit te bevestigen en voortdurend te valideren, is door tests voor uw script of module te schrijven en uit te voeren op alle versies en edities van PowerShell waarmee u compatibiliteit nodig hebt. Een aanbevolen testframework hiervoor is Pester.

PowerShell-script

Als taal werkt PowerShell hetzelfde tussen edities; dit zijn de cmdlets, modules en .NET API's die u gebruikt die worden beïnvloed door editiecompatibiliteit.

Over het algemeen werken scripts die in PowerShell 6.1 en hoger werken, met Windows PowerShell 5.1, maar er zijn enkele uitzonderingen.

PSScriptAnalyzer versie 1.18+ bevat regels zoals PSUseCompatibleCommands en PSUseCompatibleTypes die mogelijk niet compatibel gebruik van opdrachten en .NET API's in PowerShell-scripts kunnen detecteren.

.NET assembly's

Als u een binaire module of een module schrijft die .NET assembly's (DLL's) bevat die zijn gegenereerd op basis van broncode, moet u compileren op basis van .NET Standard en PowerShell Standard voor compatibiliteitsvalidatie van .NET en PowerShell API-compatibiliteit.

Hoewel deze bibliotheken bepaalde compatibiliteit tijdens het compileren kunnen controleren, kunnen ze geen mogelijke gedragsverschillen tussen edities ondervangen. Hiervoor moet u nog steeds tests schrijven.

Zie ook