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 programie .NET Framework. Program PowerShell 4 lub nowszy, 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 obok wcześniejszych wersji 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 interfejsu API platformy .NET i modułu programu PowerShell; niektóre interfejsy API platformy .NET, typy lub metody nie są dostępne zarówno w środowiskach uruchomieniowych platformy .NET, jak i wpływa to 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 uruchamiana za pomocą zmiennej automatycznej $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.

Wydanie 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 polem CompatiblePSEditions manifestu modułu.

Na przykład manifest modułu deklarujący zgodność z wersjami programu Desktop PowerShell i 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 Desktopwartość , ponieważ moduły utworzone przed wprowadzeniem tego pola zostały niejawnie napisane dla tej edycji.

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-Moduleprogram ) 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ąć je w nowszych wersjach programu PowerShell.

W programie PowerShell 6.1 jego formater został zaktualizowany w Get-Module -ListAvailable celu wyświetlenia zgodności 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 pochodzą z 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 systemowych programu 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ł się powiedzie, 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 przeznaczonego dla obu DesktopCore wersji programu PowerShell istnieją pewne czynności, które można zrobić, aby zapewnić zgodność między wersjami.

Jedynym prawdziwym sposobem potwierdzenia i ciągłego weryfikowania zgodności jest jednak pisanie testów dla skryptu lub modułu i uruchamianie ich we wszystkich wersjach i wersjach programu PowerShell, z których potrzebujesz zgodności. Zalecaną strukturą testowania jest Pester.

Skrypt programu PowerShell

Jako język program PowerShell działa tak samo między wersjami; są 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, które działają w programie PowerShell 6.1 lub nowszym, będą działać z programem 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ć prawdopodobnie niezgodne użycie poleceń i interfejsów API platformy .NET w skryptach programu PowerShell.

Zestawy platformy .NET

Jeśli piszesz moduł binarny lub moduł, który zawiera zestawy .NET (DLL) wygenerowane na podstawie kodu źródłowego, należy skompilować z platformami .NET Standard i PowerShell Standard w celu sprawdzania zgodności środowiska .NET i interfejsu API programu PowerShell w czasie kompilacji.

Mimo że 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.

Zobacz też