Udostępnij za pomocą


Moduły ze zgodnymi wersjami programu PowerShell

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

  • Wersja na komputery stacjonarne: Zbudowany na .NET Framework, dotyczy Windows PowerShell w wersji 4.0 i starszych, a także Windows PowerShell 5.1 w systemach Windows Desktop, Windows Server, Windows Server Core i większości innych wersji systemu Windows.
  • Edycja podstawowa: Oparty na platformie .NET Core, dotyczy programu PowerShell 6.0 i nowszych, a także Windows PowerShell 5.1 w wersjach systemu Windows o zmniejszonym zużyciu, 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ć swoje moduły jako zgodne z co najmniej jedną edycją programu PowerShell przy użyciu klucza manifestu modułu CompatiblePSEditions . Ten klucz jest obsługiwany tylko w programie PowerShell 5.1 lub nowszym.

Uwaga / Notatka

Po określeniu manifestu modułu za pomocą klucza CompatiblePSEditions lub użyciu zmiennej $PSEdition nie można go zaimportować do programu 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 uzyskiwania listy dostępnych modułów możesz filtrować 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 decydowania, czy moduł jest zgodny, CompatiblePSEditions 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 kompatybilnych modułów

Użytkownicy Galeria programu PowerShell 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 działające prawidłowo 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 na wiele wersji

Autorzy modułów mogą publikować pojedynczy moduł przeznaczony dla jednej lub obu wersji programu PowerShell (klasycznej i podstawowej).

Pojedynczy moduł może działać zarówno w wersji Desktop, jak i Core, w tym module autor musi dodać wymaganą logikę w RootModule lub w manifeście modułu using $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 do określania wartości docelowej 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
  • Ustawienia\CmdletDesign.psd1
  • Ustawienia\DSC.psd1
  • Ustawienia\ScriptFunctions.psd1
  • Ustawienia\ScriptingStyle.psd1
  • Ustawienia\ScriptSecurity.psd1

Zawartość PSScriptAnalyzer.psd1 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 edycji lub wersji.

Zawartość PSScriptAnalyzer.psm1 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 systemie PS 5.1 lub nowszym $PSEdition zmienna globalna jest dozwolona w pliku manifestu modułu. Korzystając z tej zmiennej, autor modułu może określić wartości warunkowe w pliku manifestu modułu. $PSEdition można odwoływać się do zmiennej w trybie języka ograniczonego lub w sekcji Dane.

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

@{
    # 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 PSEditions

Obsługa funkcji PSEditions w programie PowerShellGallery

Aktualizuj manifest modułu

about_PowerShell_Editions