互換性のある PowerShell エディションが含まれるモジュールModules with compatible PowerShell Editions

バージョン 5.1 から、PowerShell はさまざまな機能セットとプラットフォーム互換性を備える別のエディションで使用できます。Starting with version 5.1, PowerShell is available in different editions which denote varying feature sets and platform compatibility.

  • Desktop Edition: .NET Framework に基づいて構成され、Windows デスクトップ、Windows Server、Windows Server Core、およびその他のほとんどの Windows エディション上の Windows PowerShell v4.0 以下と Windows PowerShell 5.1 に適用されます。Desktop Edition: Built on .NET Framework, applies to Windows PowerShell v4.0 and below as well as Windows PowerShell 5.1 on Windows Desktop, Windows Server, Windows Server Core and most other Windows editions.
  • Core Edition: .NET Core に基づいて構築され、Windows IoT や Windows Nanoserver などのフットプリントが小さい Windows エディション上の PowerShell Core 6.0 以上と Windows PowerShell 5.1 に適用されます。Core Edition: Built on .NET Core, applies to PowerShell Core 6.0 and above as well as Windows PowerShell 5.1 on reduced footprint Windows Editions such as Windows IoT and Windows Nanoserver.

PowerShell のエディションの詳細については、about_PowerShell_Editions に関するページをご覧ください。For more information on PowerShell editions, see about_PowerShell_Editions.

互換性のあるエディションを宣言するDeclaring compatible editions

モジュールの作成者は、CompatiblePSEditions モジュール マニフェスト キーを使用して、モジュールが 1 つ以上の PowerShell エディションと互換性があることを宣言できます。Module authors can declare their modules to be compatible with one or more PowerShell editions using the CompatiblePSEditions module manifest key. このキーは、PowerShell 5.1 以降でのみサポートされます。This key is only supported on PowerShell 5.1 or later.

注意

CompatiblePSEditions キーを使用してモジュール マニフェストを指定すると、バージョン 4 以下の PowerShell にはインポートできません。Once a module manifest is specified with the CompatiblePSEditions key, it can not be imported on PowerShell versions 4 and below.

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 のエディションを条件としてフィルター処理できます。When getting a list of available modules, you can filter the list by PowerShell edition.

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

複数のエディションを対象にするTargeting multiple editions

モジュールの作成者が、PowerShell エディションのどちらかまたは両方を対象とする 1 つのモジュールを発行することができます。Module authors can publish a single module targeting to either or both PowerShell editions (Desktop and Core).

1 つのモジュールが、デスクトップとコアの両方のエディションで動作します。そのモジュール内で、作成者は、$PSEdition 変数を使用して、RootModule またはモジュール マニフェストで必要なロジックを追加する必要があります。A single module can work on both Desktop and Core editions, in that module author has to add required logic in either RootModule or in the module manifest using $PSEdition variable. モジュールでは、CoreCLR と FullCLR の両方を対象とするコンパイル済み DLL の 2 つのセットを使用できます。Modules can have two sets of compiled DLLs targeting both CoreCLR and FullCLR. 次に、適切な dll を読み込むためのロジックを含むモジュールをパッケージ化するためのいくつかのオプションを示します。Here are the couple of options to package your module with logic for loading proper dlls.

オプション 1: PowerShell の複数のバージョンおよび複数のエディションをターゲットとしてモジュールをパッケージ化するOption 1: Packaging a module for targeting multiple versions and multiple editions of PowerShell

モジュール フォルダーの内容Module folder contents

  • Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dllMicrosoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • Microsoft.Windows.PowerShell.ScriptAnalyzer.dllMicrosoft.Windows.PowerShell.ScriptAnalyzer.dll
  • PSScriptAnalyzer.psd1PSScriptAnalyzer.psd1
  • PSScriptAnalyzer.psm1PSScriptAnalyzer.psm1
  • ScriptAnalyzer.format.ps1xmlScriptAnalyzer.format.ps1xml
  • ScriptAnalyzer.types.ps1xmlScriptAnalyzer.types.ps1xml
  • coreclr\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dllcoreclr\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • coreclr\Microsoft.Windows.PowerShell.ScriptAnalyzer.dllcoreclr\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • en-US\about_PSScriptAnalyzer.help.txten-US\about_PSScriptAnalyzer.help.txt
  • en-US\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xmlen-US\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xml
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dllPSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.dllPSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • Settings\CmdletDesign.psd1Settings\CmdletDesign.psd1
  • Settings\DSC.psd1Settings\DSC.psd1
  • Settings\ScriptFunctions.psd1Settings\ScriptFunctions.psd1
  • Settings\ScriptingStyle.psd1Settings\ScriptingStyle.psd1
  • Settings\ScriptSecurity.psd1Settings\ScriptSecurity.psd1

PSScriptAnalyzer.psd1 ファイルの内容Contents of PSScriptAnalyzer.psd1 file

@{

# 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'

# ---
}

以下のロジックは、現在のエディションまたはバージョンに応じて必要なアセンブリを読み込みます。Below logic loads the required assemblies depending on the current edition or version.

PSScriptAnalyzer.psm1 ファイルの内容:Contents of PSScriptAnalyzer.psm1 file:

#
# 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:PSD1 ファイルで $PSEdition 変数を使用して適切な DLL と入れ子になった/必要なモジュールを読み込むOption 2: Use $PSEdition variable in the PSD1 file to load the proper DLLs and Nested/Required modules

PS 5.1 以降では、$PSEdition グローバル変数をモジュール マニフェスト ファイル内で使用できます。In PS 5.1 or newer, $PSEdition global variable is allowed in the module manifest file. この変数を使用すると、モジュールの作成者が、モジュール マニフェスト ファイル内で条件値を指定できます。Using this variable, module author can specify the conditional values in the module manifest file. $PSEdition 変数は、制限された言語モードまたはデータ セクション内で参照できます。$PSEdition variable can be referenced in restricted language mode or a Data section.

注意

CompatiblePSEditions キーまたは $PSEdition 変数を使用してモジュール マニフェストを指定した後、古いバージョンの PowerShell にインポートすることはできません。Once a module manifest is specified with the CompatiblePSEditions key or uses $PSEdition variable, it can not be imported on lower versions of PowerShell.

CompatiblePSEditions キーを使用するサンプルのモジュール マニフェスト ファイルSample module manifest file with CompatiblePSEditions key

@{
    # 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'
    }
}

モジュールの内容Module contents

dir -Recurse
    Directory: C:\Users\manikb\Documents\WindowsPowerShell\Modules\ModuleWithEditions

Mode           LastWriteTime   Length Name
----           -------------   ------ ----
d-----    7/5/2016   1:37 PM          clr
d-----    7/5/2016   1:36 PM          coreclr
-a----    7/5/2016   1:34 PM     4906 ModuleWithEditions.psd1

    Directory: C:\Users\manikb\Documents\WindowsPowerShell\Modules\ModuleWithEditions\clr

Mode           LastWriteTime    Length Name
----           -------------    ------ ----
-a----    7/5/2016   1:35 PM         0 MyFullClrNM1.dll
-a----    7/5/2016   1:35 PM         0 MyFullClrNM2.dll
-a----    7/5/2016   1:35 PM         0 MyFullClrRM.dl

    Directory: C:\Users\manikb\Documents\WindowsPowerShell\Modules\ModuleWithEditions\coreclr

Mode           LastWriteTime   Length Name
----           -------------   ------ ----
-a----    7/5/2016   1:35 PM        0 MyCoreClrNM1.dll
-a----    7/5/2016   1:35 PM        0 MyCoreClrNM2.dll
-a----    7/5/2016   1:35 PM        0 MyCoreClrRM.dl

PowerShell ギャラリー ユーザーは、PSEdition_Desktop および PSEdition_Core タグを使用して特定の PowerShell エディションでサポートされているモジュールの一覧を表示できます。PowerShell Gallery users can find the list of modules supported on a specific PowerShell Edition using tags PSEdition_Desktop and PSEdition_Core.

PSEdition_Desktop および PSEdition_Core タグがないモジュールは、PowerShell Desktop エディションで正常に動作するものと見なされます。Modules without PSEdition_Desktop and PSEdition_Core tags are considered to work fine on PowerShell Desktop editions.

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

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

詳細More details

PSEditions のスクリプトScripts with PSEditions

PowerShellGallery での PSEditions のサポートPSEditions support on PowerShellGallery

モジュール マニフェストを更新するUpdate module manifest

about_PowerShell_Editionsabout_PowerShell_Editions