次の方法で共有


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 以下では、この変数は存在しません。 null である $PSEdition は、値を 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 の Desktop エディションと Core エディションの両方との互換性を宣言するモジュール マニフェストは次のようになります。

@{
    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 を使用すると、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 を使用すると、CoreCompatiblePSEditions されていないモジュールは表示されません。

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 で実行することです。 これに対して推奨されるテスト フレームワークは、Pester です。

PowerShell スクリプト

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

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

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

.NET アセンブリ

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

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

こちらも参照ください