Moduler med kompatibla PowerShell-utgåvor
Från och med version 5.1 är PowerShell tillgängligt i olika utgåvor, vilket anger olika funktionsuppsättningar och plattformskompatibilitet.
- Desktop Edition: Bygger på .NET Framework gäller för Windows PowerShell v4.0 och nedan samt Windows PowerShell 5.1 på Windows Desktop, Windows Server, Windows Server Core och de flesta andra Windows-utgåvor.
- Core Edition: Bygger på .NET Core, gäller för PowerShell 6.0 och senare samt Windows PowerShell 5.1 på mindre fotavtryck Windows Editions som Windows IoT och Windows Nano Server.
Mer information om PowerShell-utgåvor finns i about_PowerShell_Editions.
Deklarera kompatibla utgåvor
Modulförfattare kan deklarera sina moduler som kompatibla med en eller flera PowerShell-utgåvor med hjälp av CompatiblePSEditions
modulmanifestnyckeln. Den här nyckeln stöds bara på PowerShell 5.1 eller senare.
Anteckning
När ett modulmanifest har angetts med CompatiblePSEditions
nyckeln eller använder variabeln $PSEdition
kan det inte importeras på PowerShell v4 eller lägre.
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;}
När du hämtar en lista över tillgängliga moduler kan du filtrera listan efter PowerShell-utgåva.
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
Från och med PowerShell 6 CompatiblePSEditions
används värdet för att avgöra om en modul är kompatibel när moduler importeras från $env:windir\System32\WindowsPowerShell\v1.0\Modules
.
Det här beteendet gäller endast för Windows. Utanför det här scenariot används värdet endast som metadata.
Hitta kompatibla moduler
PowerShell-galleriet användare kan hitta listan över moduler som stöds i en specifik PowerShell Edition med hjälp av taggar PSEdition_Desktop och PSEdition_Core.
Moduler utan PSEdition_Desktop - och PSEdition_Core-taggar anses fungera bra i PowerShell Desktop-utgåvor.
# Find modules supported on PowerShell Desktop edition
Find-Module -Tag PSEdition_Desktop
# Find modules supported on PowerShell Core editions
Find-Module -Tag PSEdition_Core
Rikta in sig på flera utgåvor
Modulförfattare kan publicera en enskild modul som riktar sig till antingen eller båda PowerShell-utgåvorna (Desktop och Core).
En enskild modul kan fungera på både Desktop- och Core-utgåvor. I den modulen måste författaren lägga till nödvändig logik i antingen RootModule eller i modulmanifestet med variabeln $PSEdition
. Moduler kan ha två uppsättningar kompilerade DLL:er för både CoreCLR och FullCLR. Här är paketeringsalternativen med logik för att läsa in rätt DLL:er.
Alternativ 1: Paketera en modul för att rikta in sig på flera versioner och flera utgåvor av PowerShell
Innehållet i modulmappen
- 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
- Inställningar\CmdletDesign.psd1
- Settings\DSC.psd1
- Settings\ScriptFunctions.psd1
- Settings\ScriptingStyle.psd1
- Settings\ScriptSecurity.psd1
PSScriptAnalyzer.psd1
Innehållet i filen
@{
# 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'
# ---
}
Logiken nedan läser in de nödvändiga sammansättningarna beroende på den aktuella utgåvan eller versionen.
PSScriptAnalyzer.psm1
Innehållet i filen:
#
# 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
}
Alternativ 2: Använd $PSEdition variabel i PSD1-filen för att läsa in rätt DLL:er
I PS 5.1 eller senare $PSEdition
tillåts global variabel i modulmanifestfilen. Med den här variabeln kan modulförfattaren ange villkorsvärdena i modulmanifestfilen. $PSEdition
variabeln kan refereras till i begränsat språkläge eller ett dataavsnitt.
Exempel på modulmanifestfil med CompatiblePSEditions
nyckel.
@{
# 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'
}
}
Modulinnehåll
- 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
Mer information
PowerShell Gallery