Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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é
- about_Automatic_Variables
- Get-Module
- importu modulu
- moduly s kompatibilními edicemi PowerShellu