about_PowerShell_Editions

簡単な説明

PowerShell のエディションが異なると、基になるランタイムが異なります。

詳細な説明

PowerShell 5.1 からは、それぞれ異なる .NET ランタイムで実行される PowerShell の複数 のエディション があります。 PowerShell 6.0 の時点では、PowerShell には次の 2 つのエディションがあります。

  • デスクトップ。.NET Framework 上で実行されます。 PowerShell 4 以下、および PowerShell 5.1 は、Windows デスクトップ、Windows Server、Windows Server Core、その他のほとんどの Windows オペレーティング システムなどのフル機能の Windows エディションで使用できます。 これは元の PowerShell エディションであり、オペレーティング システムの既定のインストールに含まれています。
  • Core。.NET Core 上で実行されます。 PowerShell 6.0 以降は、フル機能の Windows エディション、Windows Nano Server や Windows IoT などのフットプリントの削減された Windows エディション、または Linux や macOS などの Windows 以外のプラットフォームに、以前の PowerShell リリースと並行してインストールされます。

PowerShell のエディションは .NET ランタイムに対応しているため、.NET API と PowerShell モジュールの互換性の主要なインジケーターです。一部の .NET API、型、またはメソッドは両方の .NET ランタイムでは使用できません。これは、それらに依存する PowerShell スクリプトとモジュールに影響します。

$PSEdition自動変数

PowerShell 5.1 以降では、自動変数を使用して実行しているエディションを $PSEdition 確認できます。

$PSEdition
Core

PowerShell 4 以下では、この変数は存在しません。 $PSEdition null の場合は、値 Desktopを持つのと同じとして扱う必要があります。

Edition in $PSVersionTable

$PSVersionTable自動変数には、PowerShell 5.1 以降の P Standard Edition dition プロパティもあります。

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.2.2
PSEdition                      Core
GitCommitId                    7.2.2
OS                             Microsoft Windows 10.0.22000
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

P Standard Edition dition フィールドの値は自動変数と$PSEdition同じです。

CompatiblePSEditionsモジュール マニフェスト フィールド

PowerShell モジュールでは、モジュール マニフェストのフィールドを使用して互換性のある PowerShell のエディションを CompatiblePSEditions 宣言できます。

たとえば、PowerShell の両方 DesktopCore エディションとの互換性を宣言するモジュール マニフェストは次のようになります。

@{
    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

Note

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、in CompatiblePSEditions のないCoreモジュールはインポートされず、エラーが表示されます。

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、in CompatiblePSEditions のないCoreモジュールは表示されません。

Get-Module -ListAvailable BitsTransfer
# No output

どちらの場合も、switch パラメーターを -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 の両方 DesktopCore エディションを対象とする PowerShell モジュールを記述する場合は、エディション間の互換性を確保するためにできることがあります。

ただし、互換性を確認して継続的に検証する唯一の方法は、スクリプトまたはモジュールのテストを記述し、互換性が必要なすべてのバージョンとエディションの PowerShell で実行することです。 これに推奨されるテスト フレームワークは Pester です

PowerShell スクリプト

言語として、PowerShell はエディション間で同じように動作します。これは、使用するコマンドレット、モジュール、および .NET API であり、エディションの互換性の影響を受けます。

一般に、PowerShell 6.1 以降で動作するスクリプトは Windows PowerShell 5.1 で動作しますが、いくつかの例外があります。

PSScriptAnalyzer バージョン 1.18 以降には、PowerShell スクリプトでのコマンドと .NET API の互換性のない使用状況を検出できる PSUseCompatibleCommands や PSUseCompatibleTypes などの規則があります。

.NET アセンブリ

ソース コードから生成された .NET アセンブリ (DLL) を組み込んだバイナリ モジュールまたはモジュールを記述する場合は、.NET と PowerShell API の互換性のコンパイル時互換性検証のために、.NET StandardPowerShell Standard に対してコンパイルする必要があります。

これらのライブラリはコンパイル時にいくつかの互換性をチェックできますが、エディション間で考えられる動作の違いをキャッチすることはできません。 このためには、引き続きテストを記述する必要があります。

関連項目