about_PowerShell_Editions

Deskripsi singkat

Edisi PowerShell yang berbeda berjalan pada runtime yang mendasari yang berbeda.

Deskripsi panjang

Dari PowerShell 5.1, ada beberapa edisi PowerShell yang masing-masing berjalan pada runtime .NET yang berbeda. Pada PowerShell 6.0 ada dua edisi PowerShell:

  • Desktop, yang berjalan pada .NET Framework. PowerShell 4 ke bawah, serta PowerShell 5.1 tersedia untuk edisi Windows berperan lengkap seperti Windows Desktop, Windows Server, Windows Server Core, dan sebagian besar sistem operasi Windows lainnya. Ini adalah edisi PowerShell asli dan disertakan dalam penginstalan default sistem operasi.
  • Core, yang berjalan pada .NET Core. PowerShell 6.0 dan yang lebih baru diinstal berdampingan dengan rilis PowerShell sebelumnya pada edisi Windows berfitur lengkap, beberapa edisi Windows yang berkurang seperti Windows Nano Server dan Windows IoT, atau pada platform non-Windows seperti Linux dan macOS.

Karena edisi PowerShell sesuai dengan runtime .NET-nya, powerShell adalah indikator utama kompatibilitas modul .NET API dan PowerShell; beberapa API . NET, jenis atau metode tidak tersedia dalam runtime .NET dan ini mempengaruhi skrip dan modul PowerShell yang bergantung padanya.

Variabel $PSEdition otomatis

Di PowerShell 5.1 ke atas, Anda dapat mengetahui edisi apa yang Anda jalankan $PSEdition dengan variabel otomatis:

$PSEdition
Core

Di PowerShell 4 ke bawah, variabel ini tidak ada. $PSEdition null harus diperlakukan sama dengan memiliki nilai Desktop.

Edisi dalam $PSVersionTable

Variabel $PSVersionTable otomatis juga memiliki properti PSEdition di PowerShell 5.1 ke atas:

$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

Bidang PSEdition memiliki nilai yang sama dengan $PSEdition variabel otomatis.

Bidang CompatiblePSEditions manifes modul

Modul PowerShell dapat mendeklarasikan edisi PowerShell apa yang kompatibel dengannya menggunakan CompatiblePSEditions bidang manifes modul.

Misalnya, manifes modul yang menyatakan kompatibilitas dengan Desktop PowerShell edisi dan Core :

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

Contoh manifes modul hanya Desktop dengan kompatibilitas:

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

CompatiblePSEditions Menghilangkan bidang dari manifes modul akan memiliki efek yang sama dengan mengaturnya ke Desktop, karena modul yang dibuat sebelum bidang ini diperkenalkan secara implisit ditulis untuk edisi ini.

Untuk modul yang tidak dikirim sebagai bagian dari Windows (yaitu modul yang Anda tulis atau instal dari galeri), bidang ini hanya informasi; PowerShell tidak mengubah perilaku berdasarkan CompatiblePSEditions bidang , tetapi mengeksposnya pada PSModuleInfo objek (dikembalikan oleh Get-Module) untuk logika Anda sendiri:

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

Catatan

Bidang CompatiblePSEditions modul hanya kompatibel dengan PowerShell 5.1 ke atas. Termasuk bidang ini akan menyebabkan modul tidak kompatibel dengan PowerShell 4 ke bawah. Karena bidang ini murni informasi, bidang ini dapat dihilangkan dengan aman di versi PowerShell yang lebih baru.

Di PowerShell 6.1, Get-Module -ListAvailable telah memperbarui formatternya untuk menampilkan kompatibilitas edisi setiap modul:

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

Kompatibilitas edisi untuk modul yang dikirim sebagai bagian dari Windows

Untuk modul yang berasal sebagai bagian dari Windows (atau diinstal sebagai bagian dari peran atau fitur), PowerShell 6.1 ke atas memperlakukan CompatiblePSEditions bidang secara berbeda. Modul tersebut ditemukan di direktori modul sistem Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).

Untuk modul yang dimuat dari atau ditemukan di direktori ini, PowerShell 6.1 ke atas menggunakan CompatiblePSEditions bidang untuk menentukan apakah modul akan kompatibel dengan sesi saat ini dan berperilaku sesuai.

Ketika Import-Module digunakan, modul tanpa Core in tidak akan diimpor CompatiblePSEditions dan kesalahan akan ditampilkan:

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

Ketika Get-Module -ListAvailable digunakan, modul tanpa Core in CompatiblePSEditions tidak akan ditampilkan:

Get-Module -ListAvailable BitsTransfer
# No output

Dalam kedua kasus, -SkipEditionCheck parameter sakelar dapat digunakan untuk mengambil alih perilaku ini:

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

Peringatan

Import-Module -SkipEditionCheck mungkin tampak berhasil untuk modul, tetapi menggunakan modul tersebut menjalankan risiko mengalami ketidaksesuaian di kemudian hari; saat memuat modul awalnya berhasil, perintah nantinya dapat memanggil API yang tidak kompatibel dan gagal secara spontan.

Penulisan modul PowerShell untuk kompatibilitas silang edisi

Saat menulis modul PowerShell untuk menargetkan Desktop edisi PowerShell dan Core , ada hal-hal yang dapat Anda lakukan untuk memastikan kompatibilitas lintas edisi.

Satu-satunya cara yang benar untuk mengonfirmasi dan terus memvalidasi kompatibilitas adalah dengan menulis pengujian untuk skrip atau modul Anda dan menjalankannya di semua versi dan edisi PowerShell yang memerlukan kompatibilitas. Kerangka kerja pengujian yang direkomendasikan untuk ini adalah Pester.

Skrip PowerShell

Sebagai bahasa, PowerShell bekerja sama di antara edisi; ini adalah cmdlet, modul, dan API .NET yang Anda gunakan yang terpengaruh oleh kompatibilitas edisi.

Umumnya, skrip yang berfungsi di PowerShell 6.1 ke atas akan berfungsi dengan Windows PowerShell 5.1, tetapi ada beberapa pengecualian.

PSScriptAnalyzer versi 1.18+ memiliki aturan seperti PSUseCompatibleCommands dan PSUseCompatibleTypes yang dapat mendeteksi kemungkinan penggunaan perintah dan API .NET yang tidak kompatibel dalam skrip PowerShell.

Rakitan .NET

Jika Anda menulis modul biner atau modul yang menggabungkan rakitan .NET (DLL) yang dihasilkan dari kode sumber, Anda harus mengkompilasi terhadap .NET Standard dan PowerShell Standard untuk validasi kompatibilitas kompatibilitas waktu kompilasi kompatibilitas .NET dan PowerShell API.

Meskipun pustaka ini dapat memeriksa beberapa kompatibilitas pada waktu kompilasi, pustaka ini tidak akan dapat menangkap kemungkinan perbedaan perilaku antar edisi. Untuk ini, Anda masih harus menulis tes.

Lihat juga