about_PowerShell_Editions

Rövid leírás

A PowerShell különböző kiadásai különböző mögöttes futtatókörnyezeteken futnak.

Hosszú leírás

A PowerShell 5.1-ben a PowerShell több kiadása is fut egy másik .NET-futtatókörnyezetben. A PowerShell 6.0-ról a PowerShell két kiadása érhető el:

  • Desktop, amely .NET-keretrendszer fut. A PowerShell 4 és újabb, valamint a PowerShell 5.1 teljes funkcionalitású Windows-kiadásokhoz érhető el, mint például a Windows Desktop, a Windows Server, a Windows Server Core és a legtöbb más Windows operációs rendszer. Ez az eredeti PowerShell-kiadás, és az operációs rendszer alapértelmezett telepítésében szerepel.
  • A .NET Core-on futó Core. A PowerShell 6.0-s és újabb verziói a korábbi PowerShell-kiadásokkal együtt vannak telepítve teljes funkcionalitású Windows-kiadásokon, néhány csökkentett kihasználtságú Windows-kiadáson, például a Windows Nano Serveren és a Windows IoT-n, vagy nem Windows-platformokon, például Linuxon és macOS-en.

Mivel a PowerShell kiadása megfelel a .NET-futtatókörnyezetnek, ez a .NET API és a PowerShell modul kompatibilitásának elsődleges mutatója; egyes .NET API-k, -típusok vagy metódusok nem érhetők el mindkét .NET-futtatókörnyezetben, és ez hatással van az ezektől függő PowerShell-szkriptekre és modulokra.

Az $PSEdition automatikus változó

A PowerShell 5.1-ben és újabb verziókban megtudhatja, hogy melyik kiadást futtatja az $PSEdition automatikus változóval:

$PSEdition
Core

A PowerShell 4-ben és alatta ez a változó nem létezik. $PSEdition a null értéket ugyanúgy kell kezelni, mint az értéket Desktop.

Kiadás a következőben: $PSVersionTable

Az $PSVersionTable automatikus változó P Standard kiadás dition tulajdonságot is használ a PowerShell 5.1-ben és újabb verziókban:

$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

A P Standard kiadás dition mező értéke megegyezik az $PSEdition automatikus változó értékével.

A CompatiblePSEditions modul jegyzékmezője

A PowerShell-modulok deklarálhatják, hogy a PowerShell mely kiadásai kompatibilisek a CompatiblePSEditions moduljegyzék mezőinek használatával.

Például egy moduljegyzék, amely a PowerShell mindkét Desktop verziójával és Core kiadásával való kompatibilitást deklarál:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop', 'Core')
}

Példa egy csak Desktop kompatibilitással rendelkező moduljegyzékre:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop')
}

Ha kihagyja a CompatiblePSEditions mezőt egy moduljegyzékből, az ugyanolyan hatással lesz, mint a beállításra Desktop, mivel a mező bevezetése előtt létrehozott modulok implicit módon lettek megírva ehhez a kiadáshoz.

A Windows részeként nem szállított modulok (azaz a katalógusból írt vagy telepített modulok) esetében ez a mező csak tájékoztató jellegű; A PowerShell nem módosítja a viselkedést a CompatiblePSEditions mező alapján, de a saját logikája szerint teszi elérhetővé az PSModuleInfo objektumon (visszaadva):Get-Module

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core

Feljegyzés

A CompatiblePSEditions modulmező csak a PowerShell 5.1-gyel és újabb verzióval kompatibilis. Ha ezt a mezőt is beleszámítjuk, akkor egy modul nem kompatibilis a PowerShell 4-gyel és az alábbi verzióval. Mivel a mező tisztán tájékoztató jellegű, a későbbi PowerShell-verziókban biztonságosan kihagyható.

A PowerShell 6.1-ben frissítettük a formátumot az Get-Module -ListAvailable egyes modulok kiadáskompatibilitásának megjelenítéséhez:

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...

Kiadáskompatibilitás a Windows részeként szállított modulokhoz

A Windows részeként (vagy szerepkör vagy funkció részeként telepített) modulok esetében a PowerShell 6.1 és újabb verziói másképp kezelik a CompatiblePSEditions mezőt. Ezek a modulok a Windows PowerShell rendszermodulok könyvtárában (%windir%\System\WindowsPowerShell\v1.0\Modules) találhatók.

Az ebben a könyvtárban betöltött vagy abban található modulok esetében a PowerShell 6.1 és újabb verziók a CompatiblePSEditions mező használatával határozzák meg, hogy a modul kompatibilis lesz-e az aktuális munkamenettel, és ennek megfelelően viselkedik-e.

Ha Import-Module használatban van, a rendszer nem importál egy be CompatiblePSEditions nem Core lépő modult, és hibaüzenet jelenik meg:

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

Használat esetén Get-Module -ListAvailable a be nem CoreCompatiblePSEditions adott modulok nem jelennek meg:

Get-Module -ListAvailable BitsTransfer
# No output

Mindkét esetben a -SkipEditionCheck kapcsolóparaméter használható a viselkedés felülbírálásához:

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,...

Figyelmeztetés

Import-Module -SkipEditionCheck a modul sikeresnek tűnhet, de a modul használata esetén fennáll annak a kockázata, hogy később kompatibilitási problémákba ütközik; miközben a modul betöltése kezdetben sikeres, egy parancs később inkompatibilis API-t hívhat meg, és spontán meghiúsulhat.

PowerShell-modulok készítése a kiadások keresztkompatibilitásához

Ha PowerShell-modult ír a PowerShell mindkét Desktop és Core kiadásának megcélzásához, a kiadások közötti kompatibilitás biztosítása érdekében számos dolgot tehet.

A kompatibilitás megerősítésének és folyamatos ellenőrzésének egyetlen valódi módja az, ha teszteket ír a szkripthez vagy modulhoz, és futtatja őket a PowerShell összes verziójában és kiadásában, amellyel kompatibilitásra van szüksége. Ehhez ajánlott tesztelési keretrendszer a Pester.

PowerShell-szkript

Nyelvként a PowerShell ugyanúgy működik a kiadások között; a kiadások kompatibilitása által érintett parancsmagok, modulok és .NET API-k.

A PowerShell 6.1-ben és újabb verziókban működő szkriptek általában a Windows PowerShell 5.1-ben működnek, de vannak kivételek.

A PSScriptAnalyzer 1.18+-os verziója olyan szabályokkal rendelkezik, mint a PSUseCompatibleCommands és a PSUseCompatibleTypes , amelyek képesek észlelni a parancsok és a .NET API-k esetleg nem kompatibilis használatát a PowerShell-szkriptekben.

.NET-szerelvények

Ha olyan bináris modult vagy modult ír, amely a forráskódból létrehozott .NET-szerelvényeket (DLL-eket) tartalmaz, a .NET Standard és a PowerShell Standard alapján kell fordítania a .NET és a PowerShell API kompatibilitásának fordítási idő szerinti ellenőrzéséhez.

Bár ezek a kódtárak fordításkor ellenőrizhetik a kompatibilitást, nem fogják tudni észlelni a kiadások közötti lehetséges viselkedésbeli különbségeket. Ehhez továbbra is teszteket kell írnia.

Lásd még