về Phiên bản PowerShell
Mô tả ngắn
Các phiên bản PowerShell khác nhau chạy trên các thời gian chạy cơ bản khác nhau.
Mô tả dài
Từ PowerShell 5.1, có nhiều phiên bản của PowerShell, mỗi phiên bản chạy trên thời gian chạy .NET khác nhau. Kể từ PowerShell 6.0, có hai phiên bản PowerShell:
- Máy tính để bàn, chạy trên .NET Framework. PowerShell 4 trở xuống, cũng như PowerShell 5.1 đều có sẵn cho các phiên bản Windows đầy đủ tính năng như Windows Desktop, Windows Server, Windows Server Core và hầu hết các hệ điều hành Windows khác. Đây là phiên bản PowerShell gốc và được bao gồm trong cài đặt mặc định của hệ điều hành.
- Core, chạy trên .NET Core. PowerShell 6.0 trở lên được cài đặt song song với các bản phát hành PowerShell trước đó trên các phiên bản Windows đầy đủ tính năng, một số phiên bản Windows có dung lượng nhỏ hơn như Windows Nano Server và Windows IoT hoặc trên các nền tảng không phải Windows như Linux và macOS.
Vì phiên bản PowerShell tương ứng với thời gian chạy .NET của nó nên đây là chỉ báo chính về khả năng tương thích của mô-đun PowerShell và API .NET; một số API, loại hoặc phương thức .NET không có sẵn trong cả hai thời gian chạy .NET và điều này ảnh hưởng đến các tập lệnh và mô-đun PowerShell phụ thuộc vào chúng.
Biến tự động $PSEdition
Trong PowerShell 5.1 trở lên, bạn có thể biết mình đang chạy phiên bản nào với biến tự động $PSEdition:
$PSEdition
Core
Trong PowerShell 4 trở xuống, biến này không tồn tại. $PSEdition bị rỗng nên được coi giống như có giá trị Desktop.
Phiên bản trong $PSVersionTable
Biến tự động $PSVersionTable cũng có thuộc tính PSEdition trong PowerShell 5.1 trở lên:
$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
Trường PSEdition có cùng giá trị với biến tự động $PSEdition.
Trường bảng kê khai mô-đun CompatiblePSEditions
Mô-đun PowerShell có thể khai báo phiên bản PowerShell nào tương thích với chúng bằng cách sử dụng trường CompatiblePSEditions của bảng kê khai mô-đun.
Ví dụ: một bảng kê khai mô-đun khai báo khả năng tương thích với cả phiên bản Desktop và Core của PowerShell:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop', 'Core')
}
Ví dụ về tệp kê khai mô-đun chỉ có khả năng tương thích với Máy tính để bàn:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop')
}
Việc bỏ qua trường CompatiblePSEditions khỏi bảng kê khai mô-đun sẽ có tác dụng tương tự như việc đặt trường đó thành Máy tính để bàn, vì các mô-đun được tạo trước khi trường này được giới thiệu đã được viết ngầm cho ấn bản này.
Đối với các mô-đun không được cung cấp như một phần của Windows (tức là các mô-đun bạn viết hoặc cài đặt từ thư viện), trường này chỉ mang tính chất cung cấp thông tin; PowerShell không thay đổi hành vi dựa trên trường CompatiblePSEditions nhưng hiển thị nó trên đối tượng PSModuleInfo (được trả về bởi Get-Module) cho riêng bạn logic:
New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Ghi chú
Trường mô-đun CompatiblePSEditions chỉ tương thích với PowerShell 5.1 trở lên. Việc bao gồm trường này sẽ khiến mô-đun không tương thích với PowerShell 4 trở xuống. Vì trường này hoàn toàn mang tính thông tin nên có thể bỏ qua nó một cách an toàn trong các phiên bản PowerShell sau này.
Trong PowerShell 6.1, Get-Module -ListAvailable đã cập nhật bộ định dạng để hiển thị khả năng tương thích phiên bản của từng mô-đun:
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...
Khả năng tương thích phiên bản dành cho các mô-đun được cung cấp như một phần của Windows
Đối với các mô-đun là một phần của Windows (hoặc được cài đặt như một phần của vai trò hoặc tính năng), PowerShell 6.1 trở lên xử lý trường CompatiblePSEditions theo cách khác. Các mô-đun như vậy được tìm thấy trong thư mục mô-đun hệ thống Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).
Đối với các mô-đun được tải từ hoặc được tìm thấy trong thư mục này, PowerShell 6.1 trở lên sử dụng trường CompatiblePSEditions để xác định xem mô-đun có tương thích với phiên hiện tại hay không và hoạt động tương ứng hay không.
Khi Import-Module được sử dụng, một mô-đun không có Core trong CompatiblePSEditions sẽ không được nhập và lỗi sẽ được hiển thị:
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
Khi sử dụng Get-Module -ListAvailable, các mô-đun không có Core trong CompatiblePSEditions sẽ không được hiển thị:
Get-Module -ListAvailable BitsTransfer
# No output
Trong cả hai trường hợp, tham số chuyển đổi -SkipEditionCheck có thể được sử dụng để ghi đè hành vi này:
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,...
Cảnh báo
Import-Module -SkipEditionCheck có thể thành công đối với một mô-đun, nhưng việc sử dụng mô-đun đó có nguy cơ gặp phải sự không tương thích sau này; trong khi tải mô-đun ban đầu thành công, lệnh sau đó có thể gọi một API không tương thích và tự động bị lỗi.
Tạo các mô-đun PowerShell để tương thích chéo với các phiên bản
Khi viết mô-đun PowerShell để nhắm mục tiêu cả phiên bản Máy tính để bàn và Core của PowerShell, bạn có thể thực hiện một số việc để đảm bảo khả năng tương thích giữa các phiên bản.
Tuy nhiên, cách thực sự duy nhất để xác nhận và liên tục xác thực tính tương thích là viết các bài kiểm tra cho tập lệnh hoặc mô-đun của bạn và chạy chúng trên tất cả các phiên bản và phiên bản PowerShell mà bạn cần khả năng tương thích. Khung thử nghiệm được đề xuất cho việc này là Pester.
Tập lệnh PowerShell
Là một ngôn ngữ, PowerShell hoạt động giống nhau giữa các phiên bản; chính các lệnh ghép ngắn, mô-đun và API .NET mà bạn sử dụng sẽ bị ảnh hưởng bởi khả năng tương thích của phiên bản.
Nói chung, các tập lệnh hoạt động trong PowerShell 6.1 trở lên sẽ hoạt động với Windows PowerShell 5.1, nhưng vẫn có một số trường hợp ngoại lệ.
PSScriptAnalyzer phiên bản 1.18+ có các quy tắc như PSUseCompatibleCommands và PSUseCompatibleTypes có thể phát hiện việc sử dụng lệnh và API .NET có thể không tương thích trong tập lệnh PowerShell.
Các tập hợp .NET
Nếu bạn đang viết một mô-đun nhị phân hoặc một mô-đun kết hợp các tập hợp .NET (DLL) được tạo từ mã nguồn, bạn nên biên dịch theo .NET Standard và PowerShell Standard để xác thực khả năng tương thích tại thời điểm biên dịch của khả năng tương thích API .NET và PowerShell.
Mặc dù các thư viện này có thể kiểm tra một số tính tương thích tại thời điểm biên dịch nhưng chúng sẽ không thể nắm bắt được những khác biệt về hành vi có thể có giữa các phiên bản. Đối với điều này bạn vẫn phải viết bài kiểm tra.
Xem thêm
- about_Automatic_Variables
- Get-Module
- Import-Module
- Các mô-đun có Phiên bản PowerShell tương thích