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


Модули с совместимыми редакциями PowerShell

Начиная с версии 5.1, PowerShell доступен в различных редакциях, которые обозначают различные наборы функций и совместимость платформ.

  • Настольная версия: Создано на основе .NET Framework, применяется к Windows PowerShell v4.0 и ниже, а также к Windows PowerShell 5.1 в Windows Desktop, Windows Server, Windows Server Core и большинстве других выпусков Windows.
  • Версия Core: Создано на основе .NET Core, применяется к PowerShell 6.0 и более поздним версиям, а также к Windows PowerShell 5.1 в выпусках Windows с уменьшенным объемом памяти, таких как Windows IoT и Windows Nano Server.

Дополнительные сведения о выпусках PowerShell см. в разделе about_PowerShell_Editions.

Объявление совместимых редакций

Авторы модулей могут объявить свои модули совместимыми с одним или несколькими выпусками PowerShell с помощью CompatiblePSEditions ключа манифеста модуля. Этот ключ поддерживается только в PowerShell 5.1 или более поздней версии.

Замечание

После того как манифест модуля указан с помощью CompatiblePSEditions ключа или используется переменная $PSEdition , его нельзя импортировать в PowerShell версии 4 или более поздней.

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion 5.1
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
$ModuleInfo | Get-Member CompatiblePSEditions
   TypeName: System.Management.Automation.PSModuleInfo

Name                 MemberType Definition
----                 ---------- ----------
CompatiblePSEditions Property   System.Collections.Generic.IEnumerable[string] CompatiblePSEditions {get;}

Получив список доступных модулей, вы можете отфильтровать список по редакции PowerShell.

Get-Module -ListAvailable -PSEdition Desktop
    Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0        ModuleWithPSEditions
Get-Module -ListAvailable -PSEdition Core | % CompatiblePSEditions
Desktop
Core

Начиная с PowerShell 6, это CompatiblePSEditions значение используется для определения совместимости модуля при импорте модулей из $env:windir\System32\WindowsPowerShell\v1.0\Modules. Это поведение относится только к Windows. За пределами этого сценария значение используется только в качестве метаданных.

Поиск совместимых модулей

Пользователи коллекции PowerShell могут найти список модулей, поддерживаемых в определенном выпуске PowerShell, с помощью тегов PSEdition_Desktop и PSEdition_Core.

Модули без тегов PSEdition_Desktop и PSEdition_Core считаются хорошо работающими в выпусках PowerShell Desktop.

# Find modules supported on PowerShell Desktop edition
Find-Module -Tag PSEdition_Desktop

# Find modules supported on PowerShell Core editions
Find-Module -Tag PSEdition_Core

Таргетинг на несколько версий

Авторы модулей могут опубликовать один модуль, предназначенный для одного или обоих выпусков PowerShell (Desktop и Core).

Один и тот же модуль может работать как на Desktop, так и на Core редакциях, в этом случае автор модуля должен добавить необходимую логику либо в RootModule, либо в манифест модуля с помощью $PSEdition переменной. Модули могут иметь два набора скомпилированных библиотек DLL, предназначенных как для CoreCLR , так и для FullCLR. Вот варианты упаковки с логикой загрузки правильных DLL.

Вариант 1: Упаковка модуля для таргетинга на несколько версий и нескольких выпусков PowerShell

Содержимое папки модуля

  • Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • PSScriptAnalyzer.psd1
  • PSScriptAnalyzer.psm1
  • ScriptAnalyzer.format.ps1xml
  • ScriptAnalyzer.types.ps1xml
  • КореCLR\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • КореCLR\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • en-US\about_PSScriptAnalyzer.help.txt
  • en-US\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xml
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • Настройки\CmdletDesign.psd1
  • Настройки\DSC.psd1
  • Настройки\ScriptFunctions.psd1
  • Настройки\ScriptingStyle.psd1
  • Настройки\ScriptSecurity.psd1

Содержимое PSScriptAnalyzer.psd1 файла

@{

# Author of this module
Author = 'Microsoft Corporation'

# Script module or binary module file associated with this manifest.
RootModule = 'PSScriptAnalyzer.psm1'

# Version number of this module.
ModuleVersion = '1.6.1'

# ---
}

Приведенная ниже логика загружает необходимые сборки в зависимости от текущей редакции или версии.

Содержимое PSScriptAnalyzer.psm1 файла:

#
# Script module for module 'PSScriptAnalyzer'
#
Set-StrictMode -Version Latest

# Set up some helper variables to make it easier to work with the module
$PSModule = $ExecutionContext.SessionState.Module
$PSModuleRoot = $PSModule.ModuleBase

# Import the appropriate nested binary module based on the current PowerShell version
$binaryModuleRoot = $PSModuleRoot


if (($PSVersionTable.Keys -contains "PSEdition") -and ($PSVersionTable.PSEdition -ne 'Desktop')) {
    $binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'coreclr'
}
else
{
    if ($PSVersionTable.PSVersion -lt [Version]'5.0')
    {
        $binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'PSv3'
    }
}

$binaryModulePath = Join-Path -Path $binaryModuleRoot -ChildPath 'Microsoft.Windows.PowerShell.ScriptAnalyzer.dll'
$binaryModule = Import-Module -Name $binaryModulePath -PassThru

# When the module is unloaded, remove the nested binary module that was loaded with it
$PSModule.OnRemove = {
    Remove-Module -ModuleInfo $binaryModule
}

Вариант 2: Используйте переменную $PSEdition файле PSD1 для загрузки соответствующих библиотек DLL

В PS 5.1 или более поздней $PSEdition версии глобальная переменная разрешена в файле манифеста модуля. Используя эту переменную, автор модуля может указать условные значения в файле манифеста модуля. $PSEdition На переменную можно ссылаться в режиме ограниченного использования языка или в разделе Данные.

Пример файла манифеста модуля с CompatiblePSEditions ключом.

@{
    # Script module or binary module file associated with this manifest.
    RootModule = if($PSEdition -eq 'Core')
    {
        'coreclr\MyCoreClrRM.dll'
    }
    else # Desktop
    {
        'clr\MyFullClrRM.dll'
    }

    # Supported PSEditions
    CompatiblePSEditions = 'Desktop', 'Core'

    # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
    NestedModules = if($PSEdition -eq 'Core')
    {
        'coreclr\MyCoreClrNM1.dll',
        'coreclr\MyCoreClrNM2.dll'
    }
    else # Desktop
    {
        'clr\MyFullClrNM1.dll',
        'clr\MyFullClrNM2.dll'
    }
}

Содержимое модуля

  • ModuleWithEditions\ModuleWithEditions.psd1
  • ModuleWithEditions\clr\MyFullClrNM1.dll
  • ModuleWithEditions\clr\MyFullClrNM2.dll
  • ModuleWithEditions\clr\MyFullClrRM.dll
  • ModuleWithEditions\coreclr\MyCoreClrNM1.dll
  • ModuleWithEditions\coreclr\MyCoreClrNM2.dll
  • ModuleWithEditions\coreclr\MyCoreClrRM.dll

Дополнительные сведения

Скрипты с PSEditions

Поддержка PSEditions в PowerShellGallery

Обновление манифеста модуля

about_PowerShell_Editions