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\Modules
programu .
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
PowerShell Gallery