about_PowerShell_Editions

Krátký popis

Různé edice PowerShellu běží na různých podkladových modulech runtime.

Dlouhý popis

Z PowerShellu 5.1 existuje několik editions PowerShellu, které se spouští v jiném modulu runtime .NET. Od PowerShellu 6.0 existují dvě edice PowerShellu:

  • Desktop, který běží na .NET Frameworku. PowerShell 4 a novější a PowerShell 5.1 jsou k dispozici pro plnohodnotné edice Windows, jako jsou Windows Desktop, Windows Server, Windows Server Core a většina ostatních operačních systémů Windows. Toto je původní edice PowerShellu a je součástí výchozí instalace operačního systému.
  • Core, která běží na .NET Core. PowerShell 6.0 a novější se instaluje souběžně s dřívějšími verzemi PowerShellu v plnohodnotných edicích Windows, některých edicích s nižšími nároky na Windows, jako jsou Windows Nano Server a Windows IoT nebo na jiných než Windows platformách, jako je Linux a macOS.

Vzhledem k tomu, že edice PowerShellu odpovídá modulu runtime .NET, je primárním indikátorem kompatibility .NET rozhraní API a modulu PowerShellu. Některá rozhraní API .NET, typy nebo metody nejsou k dispozici v .NET modulu runtime a to má vliv na skripty a moduly PowerShellu, které na nich závisejí.

Automatická $PSEdition proměnná

V PowerShellu 5.1 a novějších můžete zjistit, jakou edici používáte s $PSEdition automatickou proměnnou:

$PSEdition
Core

V PowerShellu 4 a níže tato proměnná neexistuje. $PSEdition mít hodnotu null by měla být považována za stejnou jako s hodnotou Desktop.

Edice v $PSVersionTable

Automatická proměnná $PSVersionTable má také vlastnost PSEdition v PowerShellu 5.1 a vyšší:

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

Pole PSEdition má stejnou hodnotu jako $PSEdition automatická proměnná.

Pole manifestu CompatiblePSEditions modulu

Moduly PowerShellu můžou deklarovat, s jakou edicí PowerShellu jsou kompatibilní pomocí pole CompatiblePSEditions manifestu modulu.

Například manifest modulu deklarující kompatibilitu s edicemi PowerShellu Desktop i Core:

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

Příklad manifestu modulu s pouze kompatibilitou Desktop:

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

Vynechání pole CompatiblePSEditions z manifestu modulu bude mít stejný účinek jako nastavení na Desktop, protože moduly vytvořené před zavedením tohoto pole byly implicitně napsány pro tuto edici.

Pro moduly, které nejsou dodávány jako součást Windows (tj. moduly, které píšete nebo instalujete z galerie), je toto pole pouze informativní; PowerShell nemění chování na základě pole CompatiblePSEditions, ale zveřejňuje ho na objektu PSModuleInfo (vrácený Get-Module) pro vlastní logiku:

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

Poznámka

Pole modulu CompatiblePSEditions je kompatibilní pouze s PowerShellem 5.1 a novějším. Zahrnutím tohoto pole bude modul nekompatibilní s PowerShellem 4 a níže. Vzhledem k tomu, že je pole čistě informativní, můžete ho bezpečně vynechat v pozdějších verzích PowerShellu.

V PowerShellu 6.1 měl Get-Module -ListAvailable aktualizovaný formátovací modul, aby zobrazil kompatibilitu edice jednotlivých modulů:

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...

Kompatibilita edice pro moduly, které se dodávají jako součást Windows

Pro moduly, které jsou součástí Windows (nebo jsou nainstalovány jako součást role nebo funkce), PowerShell 6.1 a vyšší zachází s polem CompatiblePSEditions odlišně. Tyto moduly najdete v adresáři Windows systémových modulů PowerShellu (%windir%\System\WindowsPowerShell\v1.0\Modules).

V případě modulů načtených z tohoto adresáře nebo nalezených v tomto adresáři používá PowerShell 6.1 a vyšší pole CompatiblePSEditions k určení, jestli bude modul kompatibilní s aktuální relací a chová se odpovídajícím způsobem.

Při použití Import-Module se modul bez Core v CompatiblePSEditions nenaimportuje a zobrazí se chyba:

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

Při použití Get-Module -ListAvailable se moduly bez Core v CompatiblePSEditions nezobrazí:

Get-Module -ListAvailable BitsTransfer
# No output

V obou případech -SkipEditionCheck[switch] lze parametr použít k přepsání tohoto chování:

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,...

Varování

Import-Module -SkipEditionCheck může být pro modul úspěšný, ale použití tohoto modulu vede k riziku, že později dojde k nekompatibilitě; při počátečním načtení modulu bude úspěšný, příkaz může později volat nekompatibilní rozhraní API a spontánně selhat.

Vytváření modulů PowerShellu pro křížovou kompatibilitu edice

Při psaní modulu PowerShellu, který cílí na Desktop i Core edice PowerShellu, můžete udělat něco, co můžete udělat, abyste zajistili kompatibilitu mezi edicemi.

Jediný pravdivý způsob, jak potvrdit a průběžně ověřit kompatibilitu, je ale psát testy pro váš skript nebo modul a spouštět je ve všech verzích a edicích PowerShellu, se kterými potřebujete kompatibilitu. Doporučená testovací architektura pro toto je Pester.

Skript PowerShellu

PowerShell funguje stejně jako jazyk mezi edicemi; jedná se o rutiny, moduly a .NET rozhraní API, která používáte, které mají vliv na kompatibilitu edice.

Obecně platí, že skripty, které fungují v PowerShellu 6.1 a novějším, budou fungovat s Windows PowerShellem 5.1, ale existují některé výjimky.

PSScriptAnalyzer verze 1.18 nebo novější má pravidla, jako jsou PSUseCompatibleCommands a PSUseCompatibleTypes, které můžou detekovat nekompatibilní použití příkazů a rozhraní API .NET ve skriptech PowerShellu.

sestavení .NET

Pokud píšete binární modul nebo modul, který obsahuje .NET sestavení (DLL) generované ze zdrojového kódu, měli byste zkompilovat .NET Standard a PowerShell Standard pro ověření kompatibility .NET a kompatibility rozhraní PowerShell API.

I když tyto knihovny dokážou zkontrolovat určitou kompatibilitu v době kompilace, nebudou moct zachytit možné rozdíly v chování mezi edicemi. V takovém případě musíte stále psát testy.

Viz také