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 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 berdampingan dengan rilis PowerShell sebelumnya pada edisi Windows berformat penuh, beberapa edisi Windows berkurang-footprint 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 $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.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 $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 seperti mengaturnya ke Desktop
, karena modul yang dibuat sebelum bidang ini diperkenalkan ditulis secara implisit 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 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 pengalihan 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.
Menulis 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 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 Standar .NET dan PowerShell Standard untuk validasi kompatibilitas 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.