次の方法で共有


ポータブル モジュール

Windows PowerShell は .NET Framework 用に記述され、PowerShell Core は .NET Core 用に記述されています。 ポータブル モジュールは、Windows PowerShell と PowerShell Core の両方で動作するモジュールです。 .NET Framework と .NET Core は高い互換性がありますが、2 つの API には違いがあります。 Windows PowerShell と PowerShell Core で使用できる API にも違いがあります。 両方の環境で使用することを目的としたモジュールでは、これらの違いに注意する必要があります。

既存のモジュールの移植

PSSnapIn の移植

PowerShell SnapIns は、PowerShell Core ではサポートされていません。 ただし、PSSnapIn を PowerShell モジュールに変換するのは簡単です。 通常、PSSnapIn 登録コードは、PSSnapInから派生するクラスの単一のソース ファイルにあります。 ビルドからこのソース ファイルを削除します。これは不要です。

new-ModuleManifest を使用して、PSSnapIn 登録コードの必要性を置き換える新しいモジュール マニフェストを作成します。 PSSnapIn の一部の値 (Descriptionなど) は、モジュール マニフェスト内で再利用できます。

モジュール マニフェストの RootModule プロパティは、コマンドレットを実装するアセンブリ (.dll) の名前に設定する必要があります。

.NET Portability Analyzer (別名 APIPort)

Windows PowerShell 用に記述されたモジュールを PowerShell Core で動作するように移植するには、.NET Portability Analyzerから始めます。 このツールをコンパイル済みアセンブリに対して実行して、モジュールで使用される .NET API が .NET Framework、.NET Core、およびその他の .NET ランタイムと互換性があるかどうかを判断します。 このツールは、代替 API が存在する場合に提案します。 それ以外の場合は、ランタイム チェック 追加し、特定のランタイムで使用できない機能を制限する必要がある場合があります。

新しいモジュールの作成

新しいモジュールを作成する場合は、.NET CLIを使用することをお勧めします。

PowerShell Standard モジュール テンプレートのインストール

.NET CLI がインストールされたら、テンプレート ライブラリをインストールして、単純な PowerShell モジュールを生成します。 このモジュールは、Windows PowerShell、PowerShell Core、Windows、Linux、macOS と互換性があります。

次の例は、テンプレートをインストールする方法を示しています。

dotnet new install Microsoft.PowerShell.Standard.Module.Template
The following template packages will be installed:
   Microsoft.PowerShell.Standard.Module.Template

Success: Microsoft.PowerShell.Standard.Module.Template::0.1.3 installed the following templates:
Template Name               Short Name  Language  Tags
--------------------------  ----------  --------  -------------------------
PowerShell Standard Module  psmodule    [C#]      Library/PowerShell/Module

新しいモジュール プロジェクトの作成

テンプレートがインストールされたら、そのテンプレートを使用して新しい PowerShell モジュール プロジェクトを作成できます。 この例では、サンプル モジュールは "myModule" と呼ばれます。

PS> mkdir myModule

    Directory: C:\Users\Steve

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/3/2018 2:41 PM myModule

PS> cd myModule
PS C:\Users\Steve\myModule> dotnet new psmodule
The template "PowerShell Standard Module" was created successfully.

Processing post-creation actions...
Restoring  C:\Users\Steve\myModule\myModule.csproj:
  Determining projects to restore...
  Restored C:\Users\Steve\myModule\myModule.csproj (in 184 ms).
Restore succeeded.

モジュールのビルド

標準の .NET CLI コマンドを使用してプロジェクトをビルドします。

dotnet build
PS C:\Users\Steve\myModule> dotnet build
MSBuild version 17.6.3+07e294721 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  PowerShellPG -> C:\Users\Steve\myModule\bin\Debug\netstandard2.0\myModule.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:02.36

モジュールのテスト

モジュールをビルドしたら、モジュールをインポートし、サンプル コマンドレットを実行できます。

Import-Module .\bin\Debug\netstandard2.0\myModule.dll
Test-SampleCmdlet -?
Test-SampleCmdlet -FavoriteNumber 7 -FavoritePet Cat
NAME
    Test-SampleCmdlet

SYNTAX
    Test-SampleCmdlet [-FavoriteNumber] <int> [[-FavoritePet] {Cat | Dog | Horse}] [<CommonParameters>]


ALIASES
    None


REMARKS
    None


FavoriteNumber FavoritePet
-------------- -----------
             7 Cat

モジュールのデバッグ

モジュールをデバッグするように Visual Studio Code を設定する方法のガイドについては、「コンパイル済みコマンドレットのデバッグに Visual Studio Code を使用する」を参照してください。

サポート テクノロジ

以降のセクションでは、このテンプレートで使用されるテクノロジの一部について詳しく説明します。

.NET 標準ライブラリ

.NET Standard は、すべての .NET 実装で使用できる .NET API の正式な仕様です。 .NET Standard を対象とするマネージド コードは、そのバージョンの .NET Standard と互換性のある .NET Framework および .NET Core バージョンで動作します。

手記

.NET Standard には API が存在する場合がありますが、.NET Core の API 実装では実行時に PlatformNotSupportedException がスローされる可能性があるため、Windows PowerShell と PowerShell Core との互換性を確認するには、両方の環境内でモジュールのテストを実行することをお勧めします。 また、モジュールがクロスプラットフォームであることを意図している場合は、Linux と macOS でテストを実行します。

.NET Standard をターゲットにすることで、モジュールの進化に伴い、互換性のない API が誤ってモジュールに導入されないようにします。 非互換性は、実行時ではなくコンパイル時に検出されます。

ただし、互換性のある API を使用している限り、モジュールが Windows PowerShell と PowerShell Core の両方で動作するように .NET Standard をターゲットにする必要はありません。 中間言語 (IL) は、2 つのランタイム間で互換性があります。 .NET Standard 2.0 と互換性のある .NET Framework 4.6.1 をターゲットにすることができます。 .NET Standard 2.0 の外部で API を使用しない場合、モジュールは再コンパイルなしで PowerShell Core 6 で動作します。

PowerShell 標準ライブラリ

PowerShell Standard ライブラリは、その標準のバージョン以上のすべての PowerShell バージョンで使用できる PowerShell API の正式な仕様です。

たとえば、PowerShell Standard 5.1 は、Windows PowerShell 5.1 と PowerShell Core 6.0 以降の両方と互換性があります。

PowerShell 標準ライブラリを使用してモジュールをコンパイルすることをお勧めします。 ライブラリを使用すると、WINDOWS PowerShell と PowerShell Core 6 の両方で API を使用して実装できます。 PowerShell Standard は、常に前方互換性を備えることを目的としています。 PowerShell Standard Library 5.1 を使用してビルドされたモジュールは、常に将来のバージョンの PowerShell と互換性があります。

モジュール マニフェスト

Windows PowerShell および PowerShell Core との互換性を示す

モジュールが Windows PowerShell と PowerShell Core の両方で動作することを検証した後、モジュール マニフェストは、CompatiblePSEditions プロパティを使用して互換性を明示的に示す必要があります。 Desktop の値は、モジュールが Windows PowerShell と互換性があることを意味し、Core の値はモジュールが PowerShell Core と互換性があることを意味します。 DesktopCore の両方を含めると、モジュールは Windows PowerShell と PowerShell Core の両方と互換性があります。

手記

Core は、モジュールが Windows、Linux、および macOS と互換性があることを自動的に意味するわけではありません。 CompatiblePSEditions プロパティは、PowerShell v5 で導入されました。 CompatiblePSEditions プロパティを使用するモジュール マニフェストは、PowerShell v5 より前のバージョンでは読み込みできません。

OS の互換性を示す

まず、モジュールが Linux と macOS で動作することを検証します。 次に、モジュール マニフェストでそれらのオペレーティング システムとの互換性を示します。 これにより、ユーザーは、PowerShell ギャラリーに発行されたときに、オペレーティング システムのモジュールを簡単に見つけることができます。

モジュール マニフェスト内では、PrivateData プロパティには PSData サブプロパティがあります。 Tags の省略可能な PSData プロパティは、PowerShell ギャラリーに表示される値の配列を受け入れます。 PowerShell ギャラリーでは、次の互換性値がサポートされています。

タグ 説明
PSEdition_Core PowerShell Core 6 と互換性がある
PSEdition_Desktop Windows PowerShell と互換性がある
ウィンドウズ Windows と互換性がある
Linux Linux と互換性があります (特定のディストリビューションはありません)
macOS macOS と互換性がある

例:

@{
    GUID = "4ae9fd46-338a-459c-8186-07f910774cb8"
    Author = "Microsoft Corporation"
    CompanyName = "Microsoft Corporation"
    Copyright = "(C) Microsoft Corporation. All rights reserved."
    HelpInfoUri = "https://go.microsoft.com/fwlink/?linkid=855962"
    ModuleVersion = "1.2.4"
    PowerShellVersion = "3.0"
    ClrVersion = "4.0"
    RootModule = "PackageManagement.psm1"
    Description = 'PackageManagement (a.k.a. OneGet) is a new way to discover and install software packages from around the web.
 it's a manager or multiplexer of existing package managers (also called package providers) that unifies Windows package management with a single Windows PowerShell interface. With PackageManagement, you can do the following.
  - Manage a list of software repositories in which packages can be searched, acquired and installed
  - Discover software packages
  - Seamlessly install, uninstall, and inventory packages from one or more software repositories'

    CmdletsToExport = @(
        'Find-Package',
        'Get-Package',
        'Get-PackageProvider',
        'Get-PackageSource',
        'Install-Package',
        'Import-PackageProvider'
        'Find-PackageProvider'
        'Install-PackageProvider'
        'Register-PackageSource',
        'Set-PackageSource',
        'Unregister-PackageSource',
        'Uninstall-Package'
        'Save-Package'
    )

    FormatsToProcess  = @('PackageManagement.format.ps1xml')

    PrivateData = @{
        PSData = @{
            Tags = @('PackageManagement', 'PSEdition_Core', 'PSEdition_Desktop', 'Windows', 'Linux', 'macOS')
            ProjectUri = 'https://oneget.org'
        }
    }
}

ネイティブ ライブラリへの依存関係

異なるオペレーティング システムまたはプロセッサ アーキテクチャ間で使用することを目的としたモジュールは、それ自体が一部のネイティブ ライブラリに依存するマネージド ライブラリに依存する場合があります。

PowerShell 7 より前では、マネージド ライブラリが正しく見つけられるように、適切なネイティブ dll を読み込むためのカスタム コードが必要です。

PowerShell 7 では、読み込むネイティブ バイナリは、.NET RID カタログの 表記のサブセットに従って、マネージド ライブラリの場所内のサブフォルダーで検索されます。

managed.dll folder
    |
    |--- 'win-x64' folder
    |       |--- native.dll
    |
    |--- 'win-x86' folder
    |       |--- native.dll
    |
    |--- 'win-arm' folder
    |       |--- native.dll
    |
    |--- 'win-arm64' folder
    |       |--- native.dll
    |
    |--- 'linux-x64' folder
    |       |--- native.so
    |
    |--- 'linux-x86' folder
    |       |--- native.so
    |
    |--- 'linux-arm' folder
    |       |--- native.so
    |
    |--- 'linux-arm64' folder
    |       |--- native.so
    |
    |--- 'osx-x64' folder
    |       |--- native.dylib