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, amelyek mindegyike egy másik .NET-futtatókörnyezetben fut. A PowerShell 6.0-s verziójától a PowerShell két kiadásban érhető el:

  • Desktop, amely .NET-keretrendszer fut. A PowerShell 4 és újabb verziók, valamint a PowerShell 5.1 olyan teljes funkcionalitású Windows-kiadásokhoz érhető el, mint 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ése tartalmazza.
  • A .NET Core-on futó Core. A PowerShell 6.0-s és újabb verziói a korábbi PowerShell-kiadásokkal párhuzamosan települnek a teljes funkcionalitású Windows-kiadásokra, néhány csökkentett erőforrásigényű Windows-kiadásra, például a Windows Nano Serverre és a Windows IoT-re, illetve nem Windows-platformokra, például Linuxra és macOS-re.

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 az alábbi verzióban 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ó PSEdition tulajdonsága is van 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 PSEdition 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őjével.

Például egy moduljegyzék, amely a PowerShell mindkét Desktop kiadásával és Core kiadásá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')
}

A mező kihagyása a CompatiblePSEditions moduljegyzékből ugyanazzal a hatással jár, mint a beállítása 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 elérhetővé teszi az PSModuleInfo objektumon (visszaadta Get-Module) a saját logikájához:

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

Megjegyzés

A CompatiblePSEditions modulmező csak a PowerShell 5.1-gyel és újabb verziókkal kompatibilis. A mező beleszámítva egy modul nem kompatibilis a PowerShell 4-gyel és az alábbival. Mivel a mező tisztán tájékoztató jellegű, a későbbi PowerShell-verziókban biztonságosan elhagyható.

A PowerShell 6.1-ben frissítettük a formázóját 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 egy szerepkör vagy szolgáltatás 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).

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őt használják annak meghatározására, hogy a modul kompatibilis-e az aktuális munkamenettel, és ennek megfelelően viselkedik-e.

Ha Import-Module használatban van, a rendszer nem importálja az in CompatiblePSEditions nélküli Core modulokat, é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

Ha Get-Module -ListAvailable használatban van, a be nem CoreCompatiblePSEditions iktatott modulok nem jelennek meg:

Get-Module -ListAvailable BitsTransfer
# No output

Mindkét esetben a -SkipEditionCheck kapcsolóparaméter használható a következő 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 előfordulhat, hogy egy modul esetében sikeresnek tűnik, de a modul használatakor fennáll annak a kockázata, hogy később inkompatibilitásba ü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ása érdekében

Amikor 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 van néhány dolog.

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

PowerShell-parancsprogram

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

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

A PSScriptAnalyzer 1.18-as vagy újabb 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, akkor a .NET Standard és a PowerShell Standard alapján kell lefordítania a .NET és a PowerShell API kompatibilitásának fordítási időre vonatkozó kompatibilitás-ellenőrzéséhez.

Bár ezek a kódtárak képesek ellenőrizni a kompatibilitást a fordításkor, 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