Udostępnij za pośrednictwem


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 Desktopwartość , 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-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ąć 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.

Zobacz też