Partager via


Modules avec éditions PowerShell compatibles

À partir de la version 5.1, PowerShell est disponible en différentes éditions, ce qui dénote des ensembles de fonctionnalités variables et une compatibilité de plate-forme.

  • Édition de bureau : Basé sur .NET Framework, s’applique à Windows PowerShell v4.0 et versions antérieures, ainsi qu’à Windows PowerShell 5.1 sur Windows Desktop, Windows Server, Windows Server Core et la plupart des autres éditions de Windows.
  • Édition de base : Basé sur .NET Core, s’applique à PowerShell 6.0 et versions ultérieures, ainsi qu’à Windows PowerShell 5.1 sur les éditions Windows à encombrement réduit telles que Windows IoT et Windows Nano Server.

Pour plus d’informations sur les éditions PowerShell, consultez about_PowerShell_Editions.

Déclarer les éditions compatibles

Les auteurs de modules peuvent déclarer que leurs modules sont compatibles avec une ou plusieurs éditions de PowerShell à l’aide de la clé de manifeste du CompatiblePSEditions module. Cette clé n’est prise en charge que sur PowerShell 5.1 ou version ultérieure.

Note

Une fois qu’un manifeste de module est spécifié avec la CompatiblePSEditions clé ou utilise la $PSEdition variable, il ne peut pas être importé sur PowerShell v4 ou inférieur.

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

Lorsque vous obtenez une liste des modules disponibles, vous pouvez filtrer la liste par édition de 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

À partir de PowerShell 6, la CompatiblePSEditions valeur est utilisée pour décider si un module est compatible lorsque des modules sont importés à partir de $env:windir\System32\WindowsPowerShell\v1.0\Modules. Ce comportement ne s’applique qu’à Windows. En dehors de ce scénario, la valeur est uniquement utilisée comme métadonnées.

Trouver des modules compatibles

Les utilisateurs de PowerShell Gallery peuvent trouver la liste des modules pris en charge sur une édition PowerShell spécifique à l’aide des balises PSEdition_Desktop et PSEdition_Core.

Les modules sans balises PSEdition_Desktop et PSEdition_Core sont considérés comme fonctionnant correctement sur les éditions de bureau PowerShell.

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

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

Cibler plusieurs éditions

Les auteurs de modules peuvent publier un seul module ciblant l’une ou l’autre des éditions de PowerShell (Desktop et Core).

Un seul module peut fonctionner à la fois sur les éditions Desktop et Core, dans ce cas, l’auteur du module doit ajouter la logique requise dans RootModule ou dans le manifeste du module à l’aide $PSEdition de variable. Les modules peuvent avoir deux ensembles de DLL compilées ciblant à la fois CoreCLR et FullCLR. Voici les options d’empaquetage avec logique pour charger les DLL appropriées.

Option 1 : Empaquetage d’un module pour cibler plusieurs versions et plusieurs éditions de PowerShell

Contenu du dossier du module

  • 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
  • Paramètres\CmdletDesign.psd1
  • Paramètres\DSC.psd1
  • Paramètres\ScriptFunctions.psd1
  • Paramètres\ScriptingStyle.psd1
  • Paramètres\ScriptSecurity.psd1

Contenu du PSScriptAnalyzer.psd1 dossier

@{

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

# ---
}

La logique ci-dessous charge les assemblys requis en fonction de l’édition ou de la version actuelle.

Contenu du PSScriptAnalyzer.psm1 dossier :

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

Option 2 : Utilisez $PSEdition variable dans le fichier PSD1 pour charger les DLL appropriées

Dans PS 5.1 ou version ultérieure, $PSEdition la variable globale est autorisée dans le fichier manifeste du module. À l’aide de cette variable, l’auteur du module peut spécifier les valeurs conditionnelles dans le fichier manifeste du module. $PSEdition peut être référencée en mode de langue restreinte ou dans une section de données.

Exemple de fichier manifeste de module avec CompatiblePSEditions clé.

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

Contenu du module

  • 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

Plus d’informations

Scripts avec PSEditions

Prise en charge de PSEditions sur PowerShellGallery

Mettre à jour le manifeste du module

about_PowerShell_Editions