Поделиться через


about_PowerShell_Editions

Краткое описание

Различные выпуски PowerShell выполняются в разных базовых средах выполнения.

Длинное описание

В PowerShell 5.1 существует несколько выпусков PowerShell, которые выполняются в другой среде выполнения .NET. По состоянию на PowerShell 6.0 существует два выпуска PowerShell:

  • desktop, который работает в .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 манифеста модуля.

Например, манифест модуля, объявляющий совместимость с Desktop и Core выпусками PowerShell:

@{
    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) для собственной логики:

$newModuleManifestSplat = @{
    Path = '.\TestModuleWithEdition.psd1'
    CompatiblePSEditions = 'Desktop', 'Core'
    PowerShellVersion = '5.1'
}
New-ModuleManifest @newModuleManifestSplat
$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 в CompatiblePSEditions не будут отображаться:

Get-Module -ListAvailable BitsTransfer
# No output

В обоих случаях параметр коммутатора -SkipEditionCheck можно использовать для переопределения этого поведения:

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 для целевых Desktop и Core выпусков PowerShell можно сделать так, чтобы обеспечить совместимость между выпусками.

Единственным верным способом подтверждения и постоянной проверки совместимости является написание тестов для скрипта или модуля и их запуск во всех версиях и выпусках PowerShell, с которыми требуется совместимость. Рекомендуемая платформа тестирования для этого — Пестер.

Скрипт 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 для проверки совместимости api .NET и PowerShell во время компиляции.

Хотя эти библиотеки могут проверить некоторую совместимость во время компиляции, они не смогут перехватывать возможные различия в поведении между выпусками. Для этого необходимо по-прежнему писать тесты.

См. также