about_PowerShell_Editions

Kısa açıklama

PowerShell'in farklı sürümleri, temel alınan farklı çalışma zamanlarında çalışır.

Uzun açıklama

PowerShell 5.1'de, her biri farklı bir .NET çalışma zamanında çalışan birden çok PowerShell sürümü vardır. PowerShell 6.0 sürümünden itibaren PowerShell'in iki sürümü vardır:

  • .NET Framework üzerinde çalışan masaüstü. PowerShell 4 ve altı sürümlerin yanı sıra PowerShell 5.1, Windows Masaüstü, Windows Server, Windows Server Core ve diğer çoğu Windows işletim sistemi gibi tam özellikli Windows sürümlerinde kullanılabilir. Bu, özgün PowerShell sürümüdür ve işletim sisteminin varsayılan yüklemesine dahildir.
  • .NET Core üzerinde çalışan Core. PowerShell 6.0 ve üzeri, tam özellikli Windows sürümlerine, Windows Nano Server ve Windows IoT gibi bazı azaltılmış ayak izine sahip Windows sürümlerine veya Linux ve macOS gibi Windows dışı platformlara önceki PowerShell sürümleriyle yan yana yüklenir.

PowerShell sürümü .NET çalışma zamanına karşılık geldiği için , .NET API ve PowerShell modülü uyumluluğunun birincil göstergesidir; bazı .NET API'leri, türleri veya yöntemleri her iki .NET çalışma zamanında da kullanılamaz ve bu, bunlara bağlı PowerShell betiklerini ve modüllerini etkiler.

Otomatik $PSEdition değişken

PowerShell 5.1 ve üzeri sürümlerde otomatik değişkenle hangi sürümü çalıştırdığınızı $PSEdition öğrenebilirsiniz:

$PSEdition
Core

PowerShell 4 ve altında bu değişken yoktur. $PSEdition null değeri, değerine Desktopsahip olan ile aynı olarak ele alınmalıdır.

Sürümünde $PSVersionTable

Otomatik $PSVersionTable değişken, PowerShell 5.1 ve üzerinde PSEdition özelliğine de sahiptir:

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.3.0-preview.3
PSEdition                      Core
GitCommitId                    7.3.0-preview.3
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

PSEdition alanı, otomatik değişkenle aynı değere $PSEdition sahiptir.

Modül CompatiblePSEditions bildirim alanı

PowerShell modülleri, modül bildiriminin alanını kullanarak CompatiblePSEditions hangi PowerShell sürümleriyle uyumlu olduklarını bildirebilir.

Örneğin, PowerShell'in hem hem de DesktopCore sürümleriyle uyumluluğu belirten bir modül bildirimi:

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

Yalnızca Desktop uyumluluğu olan bir modül bildirimi örneği:

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

CompatiblePSEditions Bu alan kullanılmadan önce oluşturulan modüller bu sürüm için örtük olarak yazıldığı için, alanı bir modül bildiriminden çıkararak olarak ayarlamakla Desktopaynı etkiye sahip olacaktır.

Windows'un bir parçası olarak gönderilmeyen modüller için (örn. galeriden yazdığınız veya yüklediğiniz modüller), bu alan yalnızca bilgilendirme amaçlıdır; PowerShell, alana göre CompatiblePSEditions davranışı değiştirmez, ancak kendi mantığınız için nesnede PSModuleInfo (tarafından Get-Moduledöndürülen) kullanıma sunar:

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

Not

CompatiblePSEditions Modül alanı yalnızca PowerShell 5.1 ve üzeri ile uyumludur. Bu alanın dahil edilmesi, bir modülün PowerShell 4 ve altı ile uyumsuz olmasına neden olur. Alan tamamen bilgilendirme amaçlı olduğundan, sonraki PowerShell sürümlerinde güvenli bir şekilde atlanabilir.

PowerShell 6.1'de, Get-Module -ListAvailable her modülün sürüm uyumluluğunu görüntülemek için biçimlendirici güncelleştirildi:

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

Windows'un bir parçası olarak gelen modüller için sürüm uyumluluğu

Windows'un bir parçası olarak gelen (veya bir rol veya özelliğin parçası olarak yüklenen) modüller için PowerShell 6.1 ve üzeri, CompatiblePSEditions alanı farklı şekilde ele alır. Bu tür modüller Windows PowerShell sistem modülleri dizininde bulunur (%windir%\System\WindowsPowerShell\v1.0\Modules ).

Bu dizinden yüklenen veya bu dizinde bulunan modüller için PowerShell 6.1 ve üzeri, modülün CompatiblePSEditions geçerli oturumla uyumlu olup olmadığını belirlemek için alanını kullanır ve uygun şekilde davranır.

Import-Module kullanıldığında, içinde CompatiblePSEditions olmayan Core bir modül içeri aktarılmaz ve bir hata görüntülenir:

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

Get-Module -ListAvailable kullanıldığında, içinde CompatiblePSEditions olmayan Core modüller görüntülenmez:

Get-Module -ListAvailable BitsTransfer
# No output

Her iki durumda da switch -SkipEditionCheck parametresi bu davranışı geçersiz kılmak için kullanılabilir:

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

Uyarı

Import-Module -SkipEditionCheck bir modül için başarılı gibi görünebilir, ancak bu modülün kullanılması daha sonra bir uyumsuzlukla karşılaşma riskiyle karşılaşır; modülü yükleme işlemi başlangıçta başarılı olsa da, bir komut daha sonra uyumsuz bir API çağırabilir ve kendiliğinden başarısız olabilir.

Sürümler arası uyumluluk için PowerShell modülleri yazma

PowerShell'in hem hem de DesktopCore sürümlerini hedeflemek için bir PowerShell modülü yazarken, sürümler arası uyumluluğu sağlamak için yapabileceğiniz şeyler vardır.

Uyumluluğu onaylamanın ve sürekli doğrulamanın tek gerçek yolu, betiğiniz veya modülünüz için testler yazmak ve bunları uyumluluğa ihtiyaç duyduğunuz tüm PowerShell sürümlerinde çalıştırmaktır. Bunun için önerilen bir test çerçevesi Pester'dır.

PowerShell betiği

PowerShell, dil olarak sürümler arasında aynı şekilde çalışır; kullandığınız cmdlet'ler, modüller ve sürüm uyumluluğundan etkilenen .NET API'leridir.

Genel olarak, PowerShell 6.1 ve üzerinde çalışan betikler Windows PowerShell 5.1 ile çalışır, ancak bazı özel durumlar vardır.

PSScriptAnalyzer sürüm 1.18+, PSUseCompatibleCommands ve PSUseCompatibleTypes gibi, PowerShell betiklerinde komutların ve .NET API'lerinin muhtemelen uyumsuz kullanımını algılayabilen kurallara sahiptir.

.NET derlemeleri

Kaynak koddan oluşturulan .NET derlemelerini (DLL' ler) içeren bir ikili modül veya modül yazıyorsanız, .NET ve PowerShell API uyumluluğunun derleme zamanı uyumluluk doğrulaması için .NET Standard ve PowerShell Standard ile derlemeniz gerekir.

Bu kitaplıklar derleme zamanında bazı uyumlulukları denetleyebilse de, sürümler arasındaki olası davranış farklılıklarını yakalayamaz. Bunun için hala testler yazmanız gerekir.

Ayrıca bkz.