Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab Version 5.1 ist PowerShell in verschiedenen Editionen verfügbar, die unterschiedliche Featuresätze und Plattformkompatibilität kennzeichnen.
- Desktop-Ausgabe: Basierend auf .NET Framework, gilt für Windows PowerShell v4.0 und niedriger sowie Windows PowerShell 5.1 auf Windows Desktop, Windows Server, Windows Server Core und den meisten anderen Windows-Editionen.
- Kernausgabe: Basierend auf .NET Core, gilt für PowerShell 6.0 und höher sowie Windows PowerShell 5.1 auf Windows-Editionen mit reduziertem Speicherbedarf, z. B. Windows IoT und Windows Nano Server.
Weitere Informationen zu PowerShell-Editionen finden Sie unter about_PowerShell_Editions.
Deklarieren kompatibler Editionen
Modulautoren können ihre Module mithilfe des CompatiblePSEditions Modulmanifestschlüssels als kompatibel mit einer oder mehreren PowerShell-Editionen deklarieren. Dieser Schlüssel wird nur in PowerShell 5.1 oder höher unterstützt.
Hinweis
Sobald ein Modulmanifest mit dem CompatiblePSEditions Schlüssel angegeben wurde oder die $PSEdition Variable verwendet, kann es nicht mehr in PowerShell v4 oder niedriger importiert werden.
New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion 5.1
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
$ModuleInfo | Get-Member CompatiblePSEditions
TypeName: System.Management.Automation.PSModuleInfo
Name MemberType Definition
---- ---------- ----------
CompatiblePSEditions Property System.Collections.Generic.IEnumerable[string] CompatiblePSEditions {get;}
Wenn Sie eine Liste der verfügbaren Module abrufen, können Sie die Liste nach PowerShell-Edition filtern.
Get-Module -ListAvailable -PSEdition Desktop
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0 ModuleWithPSEditions
Get-Module -ListAvailable -PSEdition Core | % CompatiblePSEditions
Desktop
Core
Ab PowerShell 6 wird der CompatiblePSEditions Wert verwendet, um zu entscheiden, ob ein Modul kompatibel ist, wenn Module aus $env:windir\System32\WindowsPowerShell\v1.0\Modulesimportiert werden.
Dieses Verhalten gilt nur für Windows. Außerhalb dieses Szenarios wird der Wert nur als Metadaten verwendet.
Kompatible Module finden
Benutzer des PowerShell-Katalogs können die Liste der Module, die in einer bestimmten PowerShell-Edition unterstützt werden, mithilfe der Tags PSEdition_Desktop und PSEdition_Core finden.
Module ohne PSEdition_Desktop - und PSEdition_Core-Tags gelten in PowerShell Desktop-Editionen als einwandfrei.
# Find modules supported on PowerShell Desktop edition
Find-Module -Tag PSEdition_Desktop
# Find modules supported on PowerShell Core editions
Find-Module -Tag PSEdition_Core
Ausrichtung auf mehrere Editionen
Modulautoren können ein einzelnes Modul für eine oder beide PowerShell-Editionen (Desktop und Core) veröffentlichen.
Ein einzelnes Modul kann sowohl in der Desktop- als auch in der Core-Edition verwendet werden, wobei der Modulautor die erforderliche Logik entweder in RootModule oder im Modulmanifest mit $PSEdition der Variablen hinzufügen muss. Module können über zwei Sätze kompilierter DLLs verfügen, die sowohl auf CoreCLR als auch auf FullCLR abzielen. Hier sind die Paketierungsoptionen mit Logik zum Laden der richtigen DLLs.
Option 1: Verpacken eines Moduls für mehrere Versionen und Editionen von PowerShell
Inhalt des Modulordners
- Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
- Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
- PSScriptAnalyzer.psd1
- PSScriptAnalyzer.psm1
- ScriptAnalyzer.format.ps1xml
- ScriptAnalyzer.types.ps1xml
- CoreClr\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
- CoreClr\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
- en-US\about_PSScriptAnalyzer.help.txt
- en-US\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xml
- PSv3-\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
- PSv3-\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
- Einstellungen\CmdletDesign.psd1
- Einstellungen\DSC.psd1
- Einstellungen\ScriptFunctions.psd1
- Einstellungen\ScriptingStyle.psd1
- Einstellungen\ScriptSecurity.psd1
Inhalt der PSScriptAnalyzer.psd1 Datei
@{
# Author of this module
Author = 'Microsoft Corporation'
# Script module or binary module file associated with this manifest.
RootModule = 'PSScriptAnalyzer.psm1'
# Version number of this module.
ModuleVersion = '1.6.1'
# ---
}
Die folgende Logik lädt die erforderlichen Assemblys abhängig von der aktuellen Edition oder Version.
Inhalt der PSScriptAnalyzer.psm1 Datei:
#
# Script module for module 'PSScriptAnalyzer'
#
Set-StrictMode -Version Latest
# Set up some helper variables to make it easier to work with the module
$PSModule = $ExecutionContext.SessionState.Module
$PSModuleRoot = $PSModule.ModuleBase
# Import the appropriate nested binary module based on the current PowerShell version
$binaryModuleRoot = $PSModuleRoot
if (($PSVersionTable.Keys -contains "PSEdition") -and ($PSVersionTable.PSEdition -ne 'Desktop')) {
$binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'coreclr'
}
else
{
if ($PSVersionTable.PSVersion -lt [Version]'5.0')
{
$binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'PSv3'
}
}
$binaryModulePath = Join-Path -Path $binaryModuleRoot -ChildPath 'Microsoft.Windows.PowerShell.ScriptAnalyzer.dll'
$binaryModule = Import-Module -Name $binaryModulePath -PassThru
# When the module is unloaded, remove the nested binary module that was loaded with it
$PSModule.OnRemove = {
Remove-Module -ModuleInfo $binaryModule
}
Option 2: Verwenden Sie $PSEdition Variablen in der PSD1-Datei, um die richtigen DLLs zu laden
In PS 5.1 oder höher ist eine $PSEdition globale Variable in der Modulmanifestdatei zulässig. Mithilfe dieser Variablen kann der Modulautor die bedingten Werte in der Modulmanifestdatei angeben.
$PSEdition Die Variable kann im eingeschränkten Sprachmodus oder in einem Datenabschnitt referenziert werden.
Beispielmodulmanifestdatei mit CompatiblePSEditions Schlüssel.
@{
# Script module or binary module file associated with this manifest.
RootModule = if($PSEdition -eq 'Core')
{
'coreclr\MyCoreClrRM.dll'
}
else # Desktop
{
'clr\MyFullClrRM.dll'
}
# Supported PSEditions
CompatiblePSEditions = 'Desktop', 'Core'
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
NestedModules = if($PSEdition -eq 'Core')
{
'coreclr\MyCoreClrNM1.dll',
'coreclr\MyCoreClrNM2.dll'
}
else # Desktop
{
'clr\MyFullClrNM1.dll',
'clr\MyFullClrNM2.dll'
}
}
Inhalte des Moduls
- ModuleWithEditions\ModuleWithEditions.psd1
- ModuleWithEditions\clr\MyFullClrNM1.dll
- ModuleWithEditions\clr\MyFullClrNM2.dll
- ModuleWithEditions\clr\MyFullClrRM.dll
- ModuleWithEditions\coreclr\MyCoreClrNM1.dll
- ModuleWithEditions\coreclr\MyCoreClrNM2.dll
- ModuleWithEditions\coreclr\MyCoreClrRM.dll
Weitere Details
PSEditions-Unterstützung in PowerShellGallery
PowerShell Gallery