Sdílet prostřednictvím


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 edicí PowerShellu, které se spouští v jiném modulu runtime .NET. Od PowerShellu 6.0 existují dvě edice PowerShellu:

  • Desktop, která běží na rozhraní .NET Framework. 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 Windows s nižšími nároky, jako jsou Windows Nano Server a Windows IoT, nebo na jiných platformách než Windows, jako jsou Linux a macOS.

Vzhledem k tomu, že edice PowerShellu odpovídá modulu runtime .NET, je primárním indikátorem kompatibility modulů .NET API a PowerShellu; Některá rozhraní .NET API, typy nebo metody nejsou v modulech runtime .NET k dispozici, což 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 Systému 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 se nacházejí v adresáři systémových modulů Windows 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 lze k přepsání tohoto chování použít parametr přepínače -SkipEditionCheck:

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 rozhraní .NET 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 Prostředím Windows PowerShell 5.1, ale existují některé výjimky.

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

Sestavení .NET

Pokud píšete binární modul nebo modul, který obsahuje sestavení .NET generované ze zdrojového kódu, měli byste zkompilovat .NET Standard a PowerShell Standard pro ověření kompatibility rozhraní .NET a powershellového rozhraní 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é