about_PowerShell_Editions

Krátký popis

Různé edice PowerShellu se spouštějí v různých podkladových modulech runtime.

Dlouhý popis

V PowerShellu 5.1 existuje několik edic PowerShellu, které se spouští v jiném modulu runtime .NET. K 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ší je nainstalovaný souběžně se staršími verzemi PowerShellu v plnohodnotných edicích Windows, některých edicích Windows s nižším nárokem na systém Windows, jako jsou Windows Nano Server a Windows IoT, nebo na platformách jiných než Windows, jako je 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 k dispozici v modulech runtime .NET 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 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.2.2
PSEdition                      Core
GitCommitId                    7.2.2
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

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í s použitím 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í 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 CompatiblePSEditions základě pole, ale zveřejňuje ho u objektu PSModuleInfo (vráceného Get-Module) pro 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í jenom 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 v novějších verzích PowerShellu bezpečně vynechat.

V PowerShellu 6.1 Get-Module -ListAvailable byl jeho formátovací modul aktualizován, aby se zobrazila kompatibilita 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 nainstalované jako součást role nebo funkce), PowerShell 6.1 a vyšší zachází s CompatiblePSEditions polem odlišně. Tyto moduly se nacházejí v adresáři Windows PowerShell systémových modulů (%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á 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,...

Upozornění

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

Vytváření modulů PowerShellu pro zajištění křížové kompatibility edice

Při psaní modulu PowerShellu, který cílí na obě Desktop edice Core PowerShellu, existují věci, které 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ým testovacím rámcem pro toto je Pester.

Skript prostředí PowerShell

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ších, budou fungovat s 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é 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 kompatibilitou rozhraní POWERShell API.

I když tyto knihovny můž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 i nadále psát testy.

Viz také