about_PowerShell_Editions
Краткое описание
Различные выпуски PowerShell выполняются в разных базовых средах выполнения.
Подробное описание
В PowerShell 5.1 существует несколько выпусков PowerShell, каждый из которых выполняется в разных средах выполнения .NET. В PowerShell 6.0 существует два выпуска PowerShell:
- Рабочий стол, который выполняется на платформа .NET Framework. PowerShell 4 и более ранних версий, а также PowerShell 5.1 доступны для полнофункционированных выпусков Windows, таких как Windows Desktop, Windows Server, Windows Server Core и большинство других операционных систем Windows. Это исходный выпуск PowerShell, который включен в установку операционной системы по умолчанию.
- Core, который выполняется в .NET Core. PowerShell 6.0 и более поздних версий устанавливается параллельно с более ранними выпусками PowerShell в полнофункционированных выпусках Windows, некоторых выпусках Windows с уменьшенным объемом, таких как Windows Nano Server и Windows IoT, или на платформах, отличных от Windows, таких как Linux и macOS.
Так как выпуск PowerShell соответствует среде выполнения .NET, это основной показатель совместимости API .NET и модуля PowerShell; некоторые API,типы или методы .NET недоступны в средах выполнения .NET, и это влияет на скрипты и модули PowerShell, которые от них зависят.
Автоматическая $PSEdition
переменная
В PowerShell 5.1 и более поздних версий вы можете узнать, какой выпуск используется с автоматической переменной $PSEdition
:
$PSEdition
Core
В PowerShell 4 и ниже эта переменная не существует. $PSEdition
значение null должно рассматриваться так же, как и значение Desktop
.
Выпуск в $PSVersionTable
Автоматическая $PSVersionTable
переменная также имеет свойство PSEdition в PowerShell 5.1 и более поздних версий:
$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
Поле PSEdition имеет то же значение, что и автоматическая $PSEdition
переменная.
Поле манифеста CompatiblePSEditions
модуля
Модули PowerShell могут объявлять, с какими выпусками PowerShell они совместимы, используя CompatiblePSEditions
поле манифеста модуля.
Например, манифест модуля, объявляющий о совместимости как с выпусками PowerShell, так Desktop
и Core
:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop', 'Core')
}
Пример манифеста модуля только Desktop
с совместимостью:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop')
}
CompatiblePSEditions
Пропуск поля из манифеста модуля будет иметь тот же эффект, что и установка для него Desktop
значения , так как модули, созданные до появления этого поля, были неявно написаны для этого выпуска.
Для модулей, не поставляемых в составе Windows (т. е. модулей, которые вы пишете или устанавливаете из коллекции), это поле является только информационным; PowerShell не изменяет поведение в зависимости от CompatiblePSEditions
поля, но предоставляет его в PSModuleInfo
объекте (возвращается ) Get-Module
для вашей собственной логики:
New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Примечание
Поле CompatiblePSEditions
модуля совместимо только с PowerShell 5.1 и более поздних версий. Включение этого поля приведет к несовместимости модуля с PowerShell 4 и ниже. Так как поле является чисто информационным, его можно безопасно опустить в более поздних версиях PowerShell.
В PowerShell 6.1 был обновлен модуль форматирования для Get-Module -ListAvailable
отображения совместимости с выпусками каждого модуля:
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
Для модулей, которые входят в состав Windows (или устанавливаются как часть роли или компонента), PowerShell 6.1 и более поздних версий обрабатывает поле по-разному CompatiblePSEditions
. Такие модули находятся в каталоге системных модулей Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules
).
Для модулей, загруженных из этого каталога или найденных в этом каталоге, PowerShell 6.1 и более поздних версий использует CompatiblePSEditions
поле , чтобы определить, будет ли модуль совместим с текущим сеансом и работает ли он соответствующим образом.
При Import-Module
использовании модуль без Core
в CompatiblePSEditions
не будет импортирован и отобразится сообщение об ошибке:
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
использовании модули без Core
in CompatiblePSEditions
не будут отображаться:
Get-Module -ListAvailable BitsTransfer
# No output
В обоих случаях -SkipEditionCheck
параметр switch можно использовать для переопределения этого поведения:
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,...
Предупреждение
Import-Module -SkipEditionCheck
может показаться успешным для модуля, но использование этого модуля может привести к возникновению несовместимости в дальнейшем; при первоначальной загрузке модуля команда может вызвать несовместимый API и самопроизвольно завершиться ошибкой.
Создание модулей PowerShell для обеспечения совместимости с выпусками
При написании модуля PowerShell, предназначенного как для выпусков PowerShell, так Desktop
и Core
для обеспечения совместимости между выпусками.
Однако единственный верный способ подтвердить и постоянно проверять совместимость — написать тесты для скрипта или модуля и запустить их во всех версиях и выпусках PowerShell, с которыми требуется совместимость. Рекомендуемая платформа тестирования для этого — Pester.
Сценарий PowerShell
Как язык PowerShell работает одинаково в разных выпусках; это командлеты, модули и API .NET, которые вы используете, на которые влияет совместимость выпусков.
Как правило, сценарии, работающие в PowerShell 6.1 и более поздних версий, будут работать с Windows PowerShell 5.1, но есть некоторые исключения.
PSScriptAnalyzer версии 1.18+ содержит такие правила, как PSUseCompatibleCommands и PSUseCompatibleTypes , которые могут обнаруживать потенциально несовместимое использование команд и API .NET в скриптах PowerShell.
Сборки .NET
При написании двоичного модуля или модуля, включающего сборки .NET (DLL), созданные из исходного кода, необходимо выполнить компиляцию по .NET Standard и PowerShell Standard для проверки совместимости .NET и API PowerShell во время компиляции.
Хотя эти библиотеки могут проверка некоторую совместимость во время компиляции, они не смогут уловить возможные различия в поведении между выпусками. Для этого необходимо по-прежнему писать тесты.