about_PowerShell_Editions
Korte beschrijving
Verschillende edities van PowerShell worden uitgevoerd op verschillende onderliggende runtimes.
Lange beschrijving
Vanaf PowerShell 5.1 zijn er meerdere edities 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-versies geïnstalleerd op volledige Windows-edities, sommige Windows-edities met beperkte footprint, 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 voor de compatibiliteit van .NET API en PowerShell-modules; sommige .NET-API's, -typen of -methoden zijn niet beschikbaar in beide .NET-runtimes en dit is van invloed 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 hoger 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 de 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 $PSEdition
automatische variabele.
Het CompatiblePSEditions
modulemanifestveld
PowerShell-modules kunnen declareren met welke edities van PowerShell ze compatibel zijn met behulp van het CompatiblePSEditions
veld van het modulemanifest.
Bijvoorbeeld een modulemanifest waarin compatibiliteit met en Desktop
Core
edities van PowerShell wordt aangegeven:
@{
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 voor deze editie zijn geschreven.
Voor modules die niet worden verzonden als onderdeel van Windows (dat wil doen als modules die u vanuit de galerie schrijft of installeert), is dit veld alleen ter informatie; PowerShell wijzigt het gedrag niet op basis van het CompatiblePSEditions
veld, maar maakt het wel beschikbaar op het PSModuleInfo
object (geretourneerd door Get-Module
) voor uw eigen logica:
New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Notitie
Het CompatiblePSEditions
moduleveld 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 uitsluitend informatie bevat, kan het veilig worden weggelaten in latere PowerShell-versies.
In PowerShell 6.1 Get-Module -ListAvailable
is de opmaakfunctie 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 geleverd als onderdeel van Windows
Voor modules die deel uitmaken van Windows (of zijn geïnstalleerd als onderdeel van een rol of functie), behandelen PowerShell 6.1 en hoger het CompatiblePSEditions
veld anders. Dergelijke modules bevinden zich in de map Windows PowerShell systeemmodules (%windir%\System\WindowsPowerShell\v1.0\Modules
).
Voor modules die zijn geladen vanuit of gevonden in deze map, wordt in PowerShell 6.1 en hoger het CompatiblePSEditions
veld gebruikt 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
schakelparameter 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 lijken te slagen voor een module, maar het gebruik van die module loopt het risico dat er later een incompatibiliteit optreedt; tijdens het laden van de module in eerste instantie lukt, kan een opdracht later een incompatibele API aanroepen en spontaan mislukken.
PowerShell-modules ontwerpen voor compatibiliteit tussen edities
Wanneer u een PowerShell-module schrijft voor zowel Desktop
als Core
edities van PowerShell, 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 te schrijven voor uw script of module en deze 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; Het zijn de cmdlets, modules en .NET-API's die u gebruikt die worden beïnvloed door editiecompatibiliteit.
Over het algemeen werken scripts die werken in PowerShell 6.1 en hoger met Windows PowerShell 5.1, maar er zijn enkele uitzonderingen.
PSScriptAnalyzer versie 1.18+ heeft regels zoals PSUseCompatibleCommands en PSUseCompatibleTypes die mogelijk incompatibel gebruik van opdrachten en .NET API's in PowerShell-scripts kunnen detecteren.
.NET-assembly's
Als u een binaire module schrijft of een module 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 tijdens compileren van .NET- en PowerShell API-compatibiliteit.
Hoewel deze bibliotheken enige compatibiliteit kunnen controleren tijdens het compileren, kunnen ze geen mogelijke gedragsverschillen tussen edities opsporen. Hiervoor moet u nog steeds tests schrijven.