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 以降の 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
によって返されます) で公開します。
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
を使用すると、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
を使用すると、CompatiblePSEditions
にCore
されていないモジュールは表示されません。
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 以降には、powerShell スクリプトでのコマンドと .NET API の互換性がない可能性がある使用状況を検出できるPSUseCompatibleCommandsPSUseCompatibleTypes などの規則があります。
.NET アセンブリ
ソース コードから生成された .NET アセンブリ (DLL) を組み込んだバイナリ モジュールまたはモジュールを作成する場合は、.NET と PowerShell API の互換性のコンパイル時の互換性検証のために、 .NET Standard および PowerShell Standard に対してコンパイルする必要があります。
これらのライブラリはコンパイル時にいくつかの互換性を確認できますが、エディション間の動作の違いをキャッチすることはできません。 このためには、引き続きテストを記述する必要があります。
関連項目
PowerShell