Moduly s kompatibilními edicemi PowerShellu

Od verze 5.1 je PowerShell dostupný v různých edicích, které označují různé sady funkcí a kompatibilitu platforem.

  • Desktop Edition: Je založený na rozhraní .NET Framework a vztahuje se na Windows PowerShell verze 4.0 a nižší a také na Windows PowerShell 5.1 pro Windows Desktop, Windows Server, Windows Server Core a většinu dalších edic Windows.
  • Core Edition: Vychází z .NET Core a vztahuje se na PowerShell 6.0 a novější a také na Windows PowerShell 5.1 v edicích Windows s nižšími nároky, jako jsou Windows IoT a Windows Nano Server.

Další informace o edicích PowerShellu najdete v tématu about_PowerShell_Editions.

Deklarace kompatibilních edic

Autoři modulů můžou deklarovat své moduly jako kompatibilní s jednou nebo více edicemi PowerShellu pomocí klíče manifestu CompatiblePSEditions modulu. Podporu tohoto klíče poskytují jenom prostředí PowerShell 5.1 nebo novější.

Poznámka

Jakmile se manifest modulu zadá pomocí CompatiblePSEditions klíče nebo použije $PSEdition proměnnou, nedá se importovat v PowerShellu verze 4 nebo nižší.

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;}

Při získávání seznamu dostupných modulů můžete filtrovat seznam podle edice PowerShellu.

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

Počínaje PowerShellem CompatiblePSEditions 6 se hodnota používá k určení, jestli je modul kompatibilní při importu modulů z $env:windir\System32\WindowsPowerShell\v1.0\Modules. Toto chování platí jenom pro Windows. Mimo tento scénář se hodnota používá pouze jako metadata.

Vyhledání kompatibilních modulů

Galerie prostředí PowerShell uživatelé můžou najít seznam modulů podporovaných v konkrétní edici PowerShellu pomocí značek PSEdition_Desktop a PSEdition_Core.

Moduly bez značek PSEdition_Desktop a PSEdition_Core se v edicích PowerShell Desktopu považují za funkční.

# Find modules supported on PowerShell Desktop edition
Find-Module -Tag PSEdition_Desktop

# Find modules supported on PowerShell Core editions
Find-Module -Tag PSEdition_Core

Cílení na více edicí

Autoři modulů můžou publikovat jeden modul, který cílí na jednu nebo obě edice PowerShellu (Desktop a Core).

Jeden modul může fungovat v edicích Desktop i Core. V daném modulu musí autor modulu přidat požadovanou logiku buď v RootModule, nebo v manifestu modulu pomocí $PSEdition proměnné. Moduly můžou mít dvě sady kompilovaných knihoven DLL, které cílí na CoreCLR i FullCLR. Tady jsou možnosti balení s logikou pro načítání správných knihoven DLL.

Možnost 1: Balení modulu pro cílení na více verzí a více edicí PowerShellu

Obsah složky modulu

  • 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
  • Settings\CmdletDesign.psd1
  • Settings\DSC.psd1
  • Nastavení\ScriptFunctions.psd1
  • Settings\ScriptingStyle.psd1
  • Settings\ScriptSecurity.psd1

PSScriptAnalyzer.psd1 Obsah souboru

@{

# 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'

# ---
}

Níže uvedená logika načte požadovaná sestavení v závislosti na aktuální edici nebo verzi.

PSScriptAnalyzer.psm1 Obsah souboru:

#
# 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
}

Možnost 2: Načtení správných knihoven DLL pomocí proměnné $PSEdition v souboru PSD1

V SYSTÉMU PS 5.1 nebo novějším $PSEdition je v souboru manifestu modulu povolená globální proměnná. Pomocí této proměnné může autor modulu zadat podmíněné hodnoty v souboru manifestu modulu. $PSEdition proměnnou lze odkazovat v režimu omezeného jazyka nebo v oddílu Data.

Ukázkový soubor manifestu modulu s CompatiblePSEditions klíčem

@{
    # 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'
    }
}

Obsah modulu

  • 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

Další podrobnosti

Skripty s PSEditions

Podpora PSEditions v PowerShellGallery

Aktualizace manifestu modulu

about_PowerShell_Editions