about_PowerShell_Editions
Krótki opis
Różne wersje programu PowerShell działają w różnych podstawowych środowiskach uruchomieniowych.
Długi opis
W programie PowerShell 5.1 istnieje wiele wersji programu PowerShell, które są uruchamiane w innym środowisku uruchomieniowym platformy .NET. Od programu PowerShell 6.0 istnieją dwie wersje programu PowerShell:
- Desktop, który działa w .NET Framework. Program PowerShell 4 i nowsze wersje, a także program PowerShell 5.1 są dostępne dla w pełni funkcjonalnych wersji systemu Windows, takich jak Windows Desktop, Windows Server, Windows Server Core i większość innych systemów operacyjnych Windows. Jest to oryginalna wersja programu PowerShell i jest uwzględniona w domyślnej instalacji systemu operacyjnego.
- Core, który działa na platformie .NET Core. Program PowerShell 6.0 lub nowszy jest instalowany równolegle z wcześniejszymi wersjami programu PowerShell w pełnych wersjach systemu Windows, niektóre ograniczone wersje systemu Windows, takie jak Windows Nano Server i Windows IoT, lub na platformach innych niż Windows, takich jak Linux i macOS.
Ponieważ wersja programu PowerShell odpowiada jego środowisku uruchomieniowemu platformy .NET, jest to podstawowy wskaźnik zgodności z interfejsem API platformy .NET i modułem programu PowerShell; niektóre interfejsy API, typy lub metody platformy .NET nie są dostępne zarówno w środowiskach uruchomieniowych platformy .NET, jak i ma to wpływ na skrypty i moduły programu PowerShell, które są od nich zależne.
Zmienna automatyczna $PSEdition
W programie PowerShell 5.1 lub nowszym możesz dowiedzieć się, jaka wersja jest uruchomiona z zmienną automatyczną $PSEdition
:
$PSEdition
Core
W programie PowerShell 4 i poniżej ta zmienna nie istnieje. $PSEdition
wartość null powinna być traktowana jako taka sama jak wartość Desktop
.
Edycja w $PSVersionTable
Zmienna automatyczna $PSVersionTable
ma również właściwość PSEdition w programie PowerShell 5.1 lub nowszym:
$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 ma taką samą wartość jak zmienna automatyczna $PSEdition
.
Pole manifestu modułu CompatiblePSEditions
Moduły programu PowerShell mogą zadeklarować, które wersje programu PowerShell są zgodne z CompatiblePSEditions
polem manifestu modułu.
Na przykład manifest modułu deklarujący zgodność z wersjami Desktop
programu PowerShell i :Core
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop', 'Core')
}
Przykład manifestu modułu z tylko Desktop
zgodnością:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop')
}
Pominięcie pola z manifestu modułu CompatiblePSEditions
będzie miało taki sam efekt jak ustawienie go na Desktop
wartość , ponieważ moduły utworzone przed wprowadzeniem tego pola zostały niejawnie napisane dla tej wersji.
W przypadku modułów, które nie są dostarczane w ramach systemu Windows (tj. modułów, które piszesz lub instalujesz z galerii), to pole jest tylko informacyjne; Program PowerShell nie zmienia zachowania na CompatiblePSEditions
podstawie pola, ale uwidacznia go na PSModuleInfo
obiekcie (zwracanym przez Get-Module
program ) dla własnej logiki:
New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Uwaga
Pole modułu CompatiblePSEditions
jest zgodne tylko z programem PowerShell 5.1 lub nowszym. Dołączenie tego pola spowoduje, że moduł będzie niezgodny z programem PowerShell 4 i nowszym. Ponieważ pole jest czysto informacyjne, można bezpiecznie pominąć w nowszych wersjach programu PowerShell.
W programie PowerShell 6.1 jego formater został zaktualizowany, Get-Module -ListAvailable
aby wyświetlić zgodność wersji każdego modułu:
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...
Zgodność wersji modułów, które są dostarczane w ramach systemu Windows
W przypadku modułów, które są częścią systemu Windows (lub są instalowane jako część roli lub funkcji), program PowerShell 6.1 lub nowszy traktuje CompatiblePSEditions
pole inaczej. Takie moduły znajdują się w katalogu modułów systemu Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules
).
W przypadku modułów załadowanych z tego katalogu lub znalezionych w tym katalogu program PowerShell 6.1 lub nowszy używa CompatiblePSEditions
pola w celu określenia, czy moduł będzie zgodny z bieżącą sesją i zachowuje się odpowiednio.
Gdy Import-Module
jest używany, moduł bez Core
elementu in CompatiblePSEditions
nie zostanie zaimportowany i zostanie wyświetlony błąd:
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
Gdy Get-Module -ListAvailable
jest używany, moduły bez Core
elementu w CompatiblePSEditions
nie będą wyświetlane:
Get-Module -ListAvailable BitsTransfer
# No output
W obu przypadkach -SkipEditionCheck
parametr przełącznika może służyć do zastąpienia tego zachowania:
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,...
Ostrzeżenie
Import-Module -SkipEditionCheck
może wydawać się, że moduł zakończy się pomyślnie, ale użycie tego modułu może później spowodować wystąpienie niezgodności; podczas ładowania modułu początkowo kończy się powodzeniem, polecenie może później wywołać niezgodny interfejs API i spontanicznie zakończyć się niepowodzeniem.
Tworzenie modułów programu PowerShell na potrzeby zgodności między wersjami
Podczas pisania modułu programu PowerShell w celu kierowania zarówno wersji programu PowerShell, jak Desktop
i Core
do edycji programu PowerShell, można wykonać następujące czynności, aby zapewnić zgodność między wersjami.
Jedynym prawdziwym sposobem potwierdzenia i ciągłej weryfikacji zgodności jest jednak pisanie testów dla skryptu lub modułu i uruchamianie ich we wszystkich wersjach i wersjach programu PowerShell, z którą potrzebujesz zgodności. Zalecaną platformą testową jest Pester.
Skrypt programu PowerShell
Jako język program PowerShell działa tak samo między wersjami; jest to polecenia cmdlet, moduły i interfejsy API platformy .NET, których używasz, które mają wpływ na zgodność wersji.
Ogólnie rzecz biorąc, skrypty działające w programie PowerShell 6.1 lub nowszym będą działać z Windows PowerShell 5.1, ale istnieją pewne wyjątki.
Program PSScriptAnalyzer w wersji 1.18 lub nowszej ma reguły, takie jak PSUseCompatibleCommands i PSUseCompatibleTypes, które mogą wykrywać potencjalnie niezgodne użycie poleceń i interfejsów API platformy .NET w skryptach programu PowerShell.
Zestawy platformy .NET
W przypadku pisania modułu binarnego lub modułu, który zawiera zestawy .NET wygenerowane na podstawie kodu źródłowego, należy skompilować zestawy . NET Standard i PowerShell Standard na potrzeby walidacji zgodności w czasie kompilacji platformy .NET i interfejsu API programu PowerShell.
Chociaż te biblioteki są w stanie sprawdzić zgodność w czasie kompilacji, nie będą mogły przechwytywać możliwych różnic behawioralnych między wersjami. W tym celu należy nadal pisać testy.