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ěží v 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 automatickou proměnnou $PSEdition :

$PSEdition
Core

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

Edice v $PSVersionTable

Automatická $PSVersionTable proměnná 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 jakými edicemi PowerShellu jsou kompatibilní pomocí CompatiblePSEditions pole manifestu modulu.

Například manifest modulu deklarující kompatibilitu s oběma Desktop edicemi Core PowerShellu:

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

Příklad manifestu modulu s pouze Desktop kompatibilitou:

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

Vynechání CompatiblePSEditions pole z manifestu modulu bude mít stejný účinek jako nastavení Desktopna , 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 CompatiblePSEditions základě pole, ale zveřejňuje ho u objektu PSModuleInfo (vráceného Get-Module) pro vaši vlastní logiku:

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

Poznámka:

Pole CompatiblePSEditions modulu 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 byl jeho formátovací modul aktualizován tak, Get-Module -ListAvailable aby zobrazoval kompatibilitu s edicí 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 CompatiblePSEditions polem jinak. 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 nebo nalezených v tomto adresáři používá CompatiblePSEditions PowerShell 6.1 a vyšší pole k určení, jestli bude modul kompatibilní s aktuální relací a chová se odpovídajícím způsobem.

Při Import-Module použití se modul bez Core in CompatiblePSEditions neimportuje 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 Get-Module -ListAvailable použití se moduly bez Core in CompatiblePSEditions nezobrazí:

Get-Module -ListAvailable BitsTransfer
# No output

V obou případech -SkipEditionCheck lze parametr přepínače 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,...

Upozorňující

Import-Module -SkipEditionCheck může se zdát úspěšné pro modul, 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 pro cílení na obě Desktop edice Core PowerShellu můžete zajistit 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ým testovacím rozhraním 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 je PSUseCompatibleCommands a PSUseCompatibleTypes , které dokážou rozpoznat 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 (DLL) vygenerovaná ze zdrojového kódu, měli byste zkompilovat rozhraní .NET Standard a PowerShell Standard pro ověření kompatibility s kompilací rozhraní .NET a kompatibility rozhraní API PowerShellu.

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é