次の方法で共有


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 エディションであり、オペレーティング システムの既定のインストールに含まれています。
  • .NET Core 上で実行される 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を持つのと同じとして扱う必要があります。

エディション $PSVersionTable

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

$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 モジュールでは、モジュール マニフェストの フィールドの使用 CompatiblePSEditions と互換性のある PowerShell のエディションを宣言できます。

たとえば、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

注意

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

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、 を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 の使用が互換性がない可能性があることを検出できる PSUseCompatibleCommandsPSUseCompatibleTypes などの規則があります。

.NET アセンブリ

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

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

こちらもご覧ください