Moduły z zgodnymi wersjami programu PowerShell

Począwszy od wersji 5.1, program PowerShell jest dostępny w różnych wersjach, co oznacza różne zestawy funkcji i zgodność platformy.

  • Wersja klasyczna: Oparty na .NET Framework dotyczy Windows PowerShell v4.0 i nowszych, a także Windows PowerShell 5.1 w systemie Windows Desktop, Windows Server, Windows Server Core i większości innych wersji systemu Windows.
  • Core Edition: Zbudowany na platformie .NET Core, dotyczy programu PowerShell 6.0 lub nowszego, a także Windows PowerShell 5.1 w ograniczonych wersjach systemu Windows, takich jak Windows IoT i Windows Nano Server.

Aby uzyskać więcej informacji na temat wersji programu PowerShell, zobacz about_PowerShell_Editions.

Deklarowanie zgodnych wersji

Autorzy modułów mogą zadeklarować, że moduły mają być zgodne z co najmniej jedną wersją programu PowerShell przy użyciu klucza manifestu modułu CompatiblePSEditions . Ten klucz jest obsługiwany tylko w programie PowerShell 5.1 i w nowszych wersjach.

Uwaga

Po określeniu manifestu modułu z kluczem CompatiblePSEditions lub użyciu zmiennej $PSEdition nie można go zaimportować w programie PowerShell w wersji 4 lub niższej.

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

Podczas pobierania listy dostępnych modułów można filtrować tę listę według wersji programu PowerShell.

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

Począwszy od programu PowerShell 6, wartość jest używana do określania, CompatiblePSEditions czy moduł jest zgodny, gdy moduły są importowane z $env:windir\System32\WindowsPowerShell\v1.0\Modulesprogramu . To zachowanie dotyczy tylko systemu Windows. Poza tym scenariuszem wartość jest używana tylko jako metadane.

Znajdowanie zgodnych modułów

Galeria programu PowerShell użytkownicy mogą znaleźć listę modułów obsługiwanych w określonej wersji programu PowerShell przy użyciu tagów PSEdition_Desktop i PSEdition_Core.

Moduły bez tagów PSEdition_Desktop i PSEdition_Core są uważane za odpowiednie w wersjach programu PowerShell Desktop.

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

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

Kierowanie do wielu edycji

Autorzy modułów mogą opublikować pojedynczy moduł przeznaczony dla obu wersji programu PowerShell (Desktop i Core).

Pojedynczy moduł może działać zarówno w wersjach Desktop, jak i Core, w tym autor modułu musi dodać wymaganą logikę w module RootModule lub w manifeście modułu przy użyciu $PSEdition zmiennej. Moduły mogą mieć dwa zestawy skompilowanych bibliotek DLL przeznaczonych zarówno dla CoreCLR , jak i FullCLR. Poniżej przedstawiono opcje pakowania z logiką ładowania odpowiednich bibliotek DLL.

Opcja 1. Pakowanie modułu przeznaczonego dla wielu wersji i wielu wersji programu PowerShell

Zawartość folderu modułu

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

PSScriptAnalyzer.psd1 Zawartość pliku

@{

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

# ---
}

Poniższa logika ładuje wymagane zestawy w zależności od bieżącej wersji lub wersji.

PSScriptAnalyzer.psm1 Zawartość pliku:

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

Opcja 2. Użyj zmiennej $PSEdition w pliku PSD1, aby załadować odpowiednie biblioteki DLL

W programie PS 5.1 lub nowszym $PSEdition zmienna globalna jest dozwolona w pliku manifestu modułu. Za pomocą tej zmiennej autor modułu może określić wartości warunkowe w pliku manifestu modułu. $PSEdition zmiennej można odwoływać się w trybie języka z ograniczeniami lub w sekcji Dane.

Przykładowy plik manifestu modułu z kluczem CompatiblePSEditions .

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

Zawartość modułu

  • 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

Więcej szczegółów

Skrypty z elementami PSEdition

Obsługa programu PSEditions w programie PowerShellGallery

Aktualizowanie manifestu modułu

about_PowerShell_Editions