Share via


about_PowerShell_Editions

Description courte

Différentes éditions de PowerShell s’exécutent sur différents runtimes sous-jacents.

Description longue

À partir de PowerShell 5.1, il existe plusieurs éditions de PowerShell qui s’exécutent chacune sur un runtime .NET différent. À partir de PowerShell 6.2, il existe deux éditions de PowerShell :

  • Desktop, qui s’exécute sur .NET Framework. PowerShell 4 et versions ultérieures, ainsi que PowerShell 5.1 sur les éditions windows complètes telles que Windows Desktop, Windows Server, Windows Server Core et la plupart des autres systèmes d’exploitation Windows sont des éditions Desktop. Il s’agit de l’édition PowerShell d’origine.
  • Core, qui s’exécute sur .NET Core. PowerShell 6.0 et versions ultérieures, ainsi que PowerShell 5.1 sur certaines éditions Windows à encombrement réduit, telles que Windows Nano Server et Windows IoT où .NET Framework n’est pas disponible.

Étant donné que l’édition de PowerShell correspond à son runtime .NET, il s’agit du principal indicateur de compatibilité de l’API .NET et du module PowerShell . certaines API,types ou méthodes .NET ne sont pas disponibles dans les deux runtimes .NET, ce qui affecte les scripts et modules PowerShell qui en dépendent.

Variable $PSEdition automatique

Dans PowerShell 5.1 et versions ultérieures, vous pouvez découvrir l’édition que vous exécutez avec la $PSEdition variable automatique :

$PSEdition
Core

Dans PowerShell 4 et versions ultérieures, cette variable n’existe pas. $PSEdition la valeur null doit être traitée comme ayant la valeur Desktop.

Édition dans $PSVersionTable

La $PSVersionTable variable automatique contient également des informations d’édition dans PowerShell 5.1 et versions ultérieures :

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.1.6
PSEdition                      Core
GitCommitId                    7.1.6
OS                             Microsoft Windows 10.0.22000
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Le champ PSEdition a la même valeur que la $PSEdition variable automatique.

Champ CompatiblePSEditions manifeste du module

Les modules PowerShell peuvent déclarer les éditions de PowerShell avec lesquelles ils sont compatibles à l’aide du CompatiblePSEditions champ du manifeste du module.

Par exemple, un manifeste de module déclarant la compatibilité avec les Desktop éditions et Core de PowerShell :

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop', 'Core')
}

Exemple de manifeste de module avec compatibilité uniquement Desktop :

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop')
}

Omettre le CompatiblePSEditions champ d’un manifeste de module aura le même effet que de le définir sur Desktop, car les modules créés avant l’introduction de ce champ ont été implicitement écrits pour cette édition.

Pour les modules qui ne font pas partie de Windows (c’est-à-dire les modules que vous écrivez ou installez à partir de la galerie), ce champ est d’information uniquement ; PowerShell ne modifie pas le comportement en fonction du CompatiblePSEditions champ, mais l’expose sur l’objet PSModuleInfo (retourné par Get-Module) pour votre propre logique :

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core

Notes

Le CompatiblePSEditions champ de module est uniquement compatible avec PowerShell 5.1 et versions ultérieures. L’inclusion de ce champ entraîne l’incompatibilité d’un module avec PowerShell 4 et versions ultérieures. Étant donné que le champ est purement informatif, il peut être omis en toute sécurité dans les versions ultérieures de PowerShell.

Dans PowerShell 6.1, Get-Module -ListAvailable son formateur a été mis à jour pour afficher la compatibilité d’édition de chaque module :

Get-Module -ListAvailable

    Directory: C:\Users\me\Documents\PowerShell\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Script     1.4.0      Az                                  Core,Desk
Script     1.3.1      Az.Accounts                         Core,Desk {Disable-AzDataCollection, Disable-AzContextAutosave, E...
Script     1.0.1      Az.Aks                              Core,Desk {Get-AzAks, New-AzAks, Remove-AzAks, Import-AzAksCreden...

...

Script     4.4.0      Pester                              Desk      {Describe, Context, It, Should...}
Script     1.18.0     PSScriptAnalyzer                    Desk      {Get-ScriptAnalyzerRule, Invoke-ScriptAnalyzer, Invoke-...
Script     1.0.0      WindowsCompatibility                Core      {Initialize-WinSession, Add-WinFunction, Invoke-WinComm...

Compatibilité des éditions pour les modules fournis dans le cadre de Windows

Pour les modules qui font partie de Windows (ou qui sont installés dans le cadre d’un rôle ou d’une fonctionnalité), PowerShell 6.1 et versions ultérieures traitent le CompatiblePSEditions champ différemment. Ces modules se trouvent dans le répertoire des modules système Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).

Pour les modules chargés à partir de ou trouvés dans ce répertoire, PowerShell 6.1 et versions ultérieures utilise le CompatiblePSEditions champ pour déterminer si le module est compatible avec la session active et se comporte en conséquence.

Quand Import-Module est utilisé, un module sans Core dans CompatiblePSEditions n’est pas importé et une erreur s’affiche :

Import-Module BitsTransfer
Import-Module : Module 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\BitsTransfer\BitsTransfer.psd1' does not support current PowerShell edition 'Core'. Its supported editions are 'Desktop'. Use 'Import-Module -SkipEditionCheck' to ignore the compatibility of this module.
At line:1 char:1
+ Import-Module BitsTransfer
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (C:\WINDOWS\system32\u2026r\BitsTransfer.psd1:String) [Import-Module], InvalidOperationException
+ FullyQualifiedErrorId : Modules_PSEditionNotSupported,Microsoft.PowerShell.Commands.ImportModuleCommand

Quand Get-Module -ListAvailable est utilisé, les modules sans Core dans CompatiblePSEditions ne s’affichent pas :

Get-Module -ListAvailable BitsTransfer
# No output

Dans les deux cas, le -SkipEditionCheck paramètre switch peut être utilisé pour remplacer ce comportement :

Get-Module -ListAvailable -SkipEditionCheck BitsTransfer

    Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Manifest   2.0.0.0    BitsTransfer                        Desk      {Add-BitsFile, Complete-BitsTransfer, Get-BitsTransfer,...

Avertissement

Import-Module -SkipEditionCheck peut sembler réussir pour un module, mais l’utilisation de ce module risque de rencontrer une incompatibilité ultérieurement ; Lors du chargement du module, une commande peut appeler ultérieurement une API incompatible et échouer spontanément.

Création de modules PowerShell pour la compatibilité croisée des éditions

Lors de l’écriture d’un module PowerShell pour cibler à la fois les Desktop éditions et Core de PowerShell, vous pouvez effectuer certaines actions pour garantir la compatibilité entre les éditions.

La seule façon réelle de confirmer et de valider continuellement la compatibilité consiste toutefois à écrire des tests pour votre script ou module et à les exécuter sur toutes les versions et éditions de PowerShell avec lesquelles vous avez besoin de compatibilité. Une infrastructure de test recommandée pour cela est Pester.

Script PowerShell

En tant que langage, PowerShell fonctionne de la même façon entre les éditions ; ce sont les applets de commande, les modules et les API .NET que vous utilisez qui sont affectés par la compatibilité des éditions.

En règle générale, les scripts qui fonctionnent dans PowerShell 6.1 et versions ultérieures fonctionnent avec Windows PowerShell 5.1, mais il existe quelques exceptions.

PSScriptAnalyzer version 1.18+ a des règles telles que PSUseCompatibleCommands et PSUseCompatibleTypes qui sont capables de détecter l’utilisation potentiellement incompatible des commandes et des API .NET dans les scripts PowerShell.

assemblys .NET

Si vous écrivez un module binaire ou un module qui incorpore des assemblys .NET (DLL) générés à partir du code source, vous devez effectuer une compilation sur .NET Standard et PowerShell Standard pour la validation de la compatibilité au moment de la compilation de la compatibilité de .NET et de l’API PowerShell.

Bien que ces bibliothèques puissent case activée une certaine compatibilité au moment de la compilation, elles ne pourront pas détecter les différences de comportement possibles entre les éditions. Pour cela, vous devez toujours écrire des tests.

Voir aussi