次の方法で共有


about_PowerShell_Editions

簡単な説明

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

長い説明

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

  • Desktop。.NET Framework で実行されます。 PowerShell 4 以下、および PowerShell 5.1 は、Windows Desktop、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と同じように扱う必要があります。

$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

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を使用すると、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[switch] パラメーターを使用して、この動作をオーバーライドできます。

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 以降で動作するスクリプトは PowerShell 5.1 Windowsで動作しますが、いくつかの例外があります。

PSScriptAnalyzer バージョン 1.18 以降には、PSUseCompatibleCommandsPSUseCompatibleTypes

アセンブリの.NET

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

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

こちらも参照ください