Freigeben über


Module mit kompatiblen PowerShell-Editionen

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

Skripts mit PSEditions

PSEditions-Unterstützung in PowerShellGallery

Aktualisieren des Modulmanifests

about_PowerShell_Editions