about_PowerShell_Editions
簡単な説明
PowerShell の異なるエディションは、基になるランタイムごとに実行されます。
長い説明
PowerShell 5.1 では、それぞれが異なる .NET ランタイムで実行される PowerShell の複数のエディションがあります。 PowerShell 6.2 の現在、PowerShell には次の 2 つのエディションがあります。
- デスクトップ。デスクトップで実行.NET Framework。 PowerShell 4 以下、および Windows Desktop、Windows Server、Windows Server Core、その他のほとんどの Windows オペレーティング システムなどのフル機能の Windows エディションの PowerShell 5.1 は Desktop エディションです。 これは元の PowerShell エディションです。
- Core。.NET Core 上で実行されます。 PowerShell 6.0 以上、および .NET Framework が使用できない Windows Nano Server や Windows IoT などの一部のフットプリントの削減された Windows エディションの PowerShell 5.1。
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.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
PSEdition フィールドの 値は、自動変数と同$PSEditionじです。
モジュール CompatiblePSEditions マニフェスト フィールド
PowerShell モジュールでは、モジュール マニフェストの フィールドを使用して、互換性のある PowerShell CompatiblePSEditions のエディションを宣言できます。
たとえば、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
注意
モジュール 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使用されている場合Core``CompatiblePSEditions、 がないモジュールはインポートされません。エラーが表示されます。
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 使用すると、 内に がない Core モジュール CompatiblePSEditions は表示されません。
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 モジュールを記述して PowerShell Desktop Core のエディションと エディションの両方をターゲットにしている場合は、エディション間の互換性を確保するために実行できる操作があります。
ただし、互換性を確認して継続的に検証する唯一の真の方法は、スクリプトまたはモジュールのテストを作成し、互換性が必要なすべてのバージョンとエディションの PowerShell で実行する方法です。 このための推奨されるテスト フレームワークは Pester です。
PowerShell スクリプト
言語として、PowerShell はエディション間で同じように動作します。これは、エディションの互換性の影響を受ける、使用するコマンドレット、モジュール、および .NET API です。
一般に、PowerShell 6.1 以上で動作するスクリプトは Windows PowerShell 5.1 で動作しますが、いくつかの例外があります。
PSScriptAnalyzer バージョン 1.18 以上には、 PsUseCompatibleCommands や PSUseCompatibleTypes のようなルールが含まれています。これは、PowerShell スクリプトでのコマンドと .NET API の互換性のない可能性のある使用方法を検出できます。
.NET アセンブリ
ソース コードから生成された .NET アセンブリ (DLL) を組み込むバイナリ モジュールまたはモジュールを記述する場合は、.NET と PowerShell API の互換性をコンパイル時に検証するために 、.NET Standard と PowerShell Standard に対してコンパイルする必要があります。
これらのライブラリはコンパイル時に互換性を確認することができますが、エディション間で考えられる動作の違いをキャッチする機能はありません。 このためには、引き続きテストを記述する必要があります。
関連項目
フィードバック
フィードバックの送信と表示