Bagikan melalui


tentang_Edisi_PowerShell

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 berfungsi 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 bersama-sama dengan rilis PowerShell yang lebih lama pada edisi Windows berfitur lengkap, beberapa edisi Windows dengan jejak kecil seperti Windows Nano Server dan Windows IoT, atau pada platform non-Windows seperti Linux dan macOS.

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

Variabel $PSEdition otomatis

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

$PSEdition
Core

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

Edisi dalam $PSVersionTable

Variabel otomatis $PSVersionTable juga memiliki properti PSEdition di PowerShell 5.1 dan versi berikutnya:

$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

Bidang PSEdition memiliki nilai yang sama dengan variabel otomatis .

Bidang CompatiblePSEditions manifes modul

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

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

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

Contoh manifes modul dengan kompatibilitas hanya Desktop:

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

Menghilangkan bidang CompatiblePSEditions dari manifes modul akan memiliki efek yang sama seperti 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 bidang CompatiblePSEditions, tetapi mengeksposnya pada objek PSModuleInfo (dikembalikan oleh Get-Module) untuk logika Anda sendiri:

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

Nota

Bidang modul CompatiblePSEditions 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 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 dari Windows (atau diinstal sebagai bagian dari peran atau fitur), PowerShell 6.1 ke atas memperlakukan bidang CompatiblePSEditions 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 bidang CompatiblePSEditions untuk menentukan apakah modul akan kompatibel dengan sesi saat ini dan berperilaku sesuai.

Ketika Import-Module digunakan, modul tanpa Core di CompatiblePSEditions tidak akan diimpor 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 di CompatiblePSEditions tidak akan ditampilkan:

Get-Module -ListAvailable BitsTransfer
# No output

Dalam kedua kasus, parameter sakelar -SkipEditionCheck 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 berhasil untuk modul, tetapi menggunakan modul tersebut menanggung risiko mengalami ketidaksesuaian di kemudian hari; saat memuat modul awalnya berhasil, perintah nantinya dapat memanggil API yang tidak kompatibel dan kemudian gagal secara tiba-tiba.

Menulis modul PowerShell untuk kompatibilitas silang edisi

Saat menulis modul PowerShell untuk menargetkan edisi PowerShell Desktop 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 anda butuhkan kompatibilitasnya. 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 dipengaruhi 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 kompilasi 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 antara edisi. Untuk ini Anda masih harus menulis tes.

Lihat juga