モジュール

コマンドレットや関数などを追加できる仕組み

YouTube

動画による説明はこちら。

PowerShellGetについて

PowerShellGetのコマンドレット(Find-Module、Update-Moduleなど)を使用して、
PowerShell Galleryからモジュールをインポートできます。

PowerShellGetのアップデート方法

# 参考例
Install-Module PowerShellGet -Force -Scope CurrentUser

モジュールについて

ローカル環境でモジュールを作成・利用する方法について。

手順1 $env:PSModulePathの確認

PS> $env:PSModulePath
C:\Users\USERNAME\Documents\WindowsPowerShell\Modules; C:\WINDOWS\system32\WindowsPowerSh
ell\v1.0\Modules\; C:\Program Files\WindowsPowerShell\Modules; C:\WINDOWS\system32\Windows
PowerShell\v1.0\Modules

# 見やすく整形
PS> $env:PSModulePath -split ";"
C:\Users\USERNAME\Documents\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

モジュールの置き場と対象のユーザとの関係

User Path
For CurrentUser C:\Users\USERNAME\Documents\WindowsPowerShell\Modules
For AllUser C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

手順2 「フォルダ」と「フォルダと同名のpsm1ファイル」を作成する

Number.psm1

function Add-Number {
    param (
        $param1,
        $param2
    )
    return $param1 + $param2
}

function Sub-Number {
    param (
        $param1,
        $param2
    )
    return $param1 - $param2
}

手順3 モジュールの自動インポートと実行

コマンドレットや関数使用時に、モジュールが自動でインポートされます。

PS> Get-Module
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Con...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type,...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHand...

PS> Add-Number 1 1
2
PS> Sub-Number 1 1
0

PS> Get-Module
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Con...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type,...
Script     0.0        Number                              {Add-Number, Sub-Number}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHand...

Export-ModuleMemberでExportを制御する

function Add-Number {
    param (
        $param1,
        $param2
    )
    return $param1 + $param2
}

function Sub-Number {
    param (
        $param1,
        $param2
    )
    return $param1 - $param2
}

Export-ModuleMember -Function Add-Number # Changed Line
  • Add-Number:成功
  • Sub-Number:エラー
PS> Remove-Module Number
PS> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLi...


PS> Add-Number 1 1
2
PS> Sub-Number 1 1
Sub-Number : 用語 'Sub-Number' コマンドレット関数スクリプト ファイルまたは操作可能なプログラムの名前として認識され
ません名前が正しく記述されていることを確認しパスが含まれている場合はそのパスが正しいことを確認してから再試行してくださ

発生場所 :1 文字:1
+ Sub-Number 1 1
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Sub-Number:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
PS> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     0.0        Number                              Add-Number
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLi...

Import-Module(ファイルパスを指定 , モジュール名を指定)

モジュールは明示的にインポートできます。
ここでは二通りの例を試します。

  • モジュール名を指定するImport-Module
  • ファイルパスを指定するImport-Module

準備

準備として2つのモジュールを用意します。

  • 上記$env:PSModulePathに配置したNumberモジュール
  • DesktopのMultiモジュール

Desktop\Multi\Multi.psm1

function Multi-Number {
    param (
        $param1,
        $param2
    )
    return $param1 * $param2    
}

Example

PS C:\Users\USERNAME\Desktop> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Conte...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, C...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandle...


PS C:\Users\USERNAME\Desktop> Import-Module Number
PS C:\Users\USERNAME\Desktop> Import-Module .\Multi\Multi.psm1
警告: モジュール 'Multi'
からインポートされたコマンドの中には名前に承認されていない動詞を含むものがあり
のようなコマンドは検出される可能性が低くなる場合があります承認されていない動詞を含
むコマンドを見つけるにはVerbose パラメーターを使用してもう一度 Import-Module
コマンドを実行してください承認されている動詞の一覧を表示するには、「Get-Verbと入
力してください
PS C:\Users\USERNAME\Desktop> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Conte...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, C...
Script     0.0        Multi                               Multi-Number
Script     0.0        Number                              Add-Number
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandle...
PS C:\Users\USERNAME\Desktop> Add-Number 2 3
5
PS C:\Users\USERNAME\Desktop> Multi-Number 2 3
6

Module Manifestを使う

ModuleManifestを新規作成する

PS > cd ($env:PSModulePath -split ";" | select -First 1)
PS > New-ModuleManifest .\Number\Number.psd1

ModuleManifestを編集する

Number.psd1の中の、RootModuleFunctionsToExportを書き換える。

RootModule        = 'Number.psm1'
# NestedModulesで指定するのも可
FunctionsToExport = '*'
# 全てのFunctionを公開とする

以下の通り。

Number.psd1

#
# モジュール 'Number' のモジュール マニフェスト
#
# 生成者: miaji
#
# 生成日: 2020/12/24
#

@{

    # このマニフェストに関連付けられているスクリプト モジュール ファイルまたはバイナリ モジュール ファイル。
    RootModule        = 'Number.psm1'

    # このモジュールのバージョン番号です。
    ModuleVersion     = '1.0'

    # サポートされている PSEditions
    # CompatiblePSEditions = @()

    # このモジュールを一意に識別するために使用される ID
    GUID              = '98682b42-c3c6-4cee-868f-cd48eb8794e4'

    # このモジュールの作成者
    Author            = 'miaji'

    # このモジュールの会社またはベンダー
    CompanyName       = '不明'

    # このモジュールの著作権情報
    Copyright         = '(c) 2020 miaji. All rights reserved.'

    # このモジュールの機能の説明
    # Description = ''

    # このモジュールに必要な Windows PowerShell エンジンの最小バージョン
    # PowerShellVersion = ''

    # このモジュールに必要な Windows PowerShell ホストの名前
    # PowerShellHostName = ''

    # このモジュールに必要な Windows PowerShell ホストの最小バージョン
    # PowerShellHostVersion = ''

    # このモジュールに必要な Microsoft .NET Framework の最小バージョン。 この前提条件は、PowerShell Desktop エディションについてのみ有効です。
    # DotNetFrameworkVersion = ''

    # このモジュールに必要な共通言語ランタイム (CLR) の最小バージョン。 この前提条件は、PowerShell Desktop エディションについてのみ有効です。
    # CLRVersion = ''

    # このモジュールに必要なプロセッサ アーキテクチャ (なし、X86、Amd64)
    # ProcessorArchitecture = ''

    # このモジュールをインポートする前にグローバル環境にインポートされている必要があるモジュール
    # RequiredModules = @()

    # このモジュールをインポートする前に読み込まれている必要があるアセンブリ
    # RequiredAssemblies = @()

    # このモジュールをインポートする前に呼び出し元の環境で実行されるスクリプト ファイル (.ps1)。
    # ScriptsToProcess = @()

    # このモジュールをインポートするときに読み込まれる型ファイル (.ps1xml)
    # TypesToProcess = @()

    # このモジュールをインポートするときに読み込まれる書式ファイル (.ps1xml)
    # FormatsToProcess = @()

    # RootModule/ModuleToProcess に指定されているモジュールの入れ子になったモジュールとしてインポートするモジュール
    # NestedModules     = @()

    # このモジュールからエクスポートする関数です。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートする関数がない場合は、エントリを削除しないで空の配列を使用してください。
    FunctionsToExport = '*'

    # このモジュールからエクスポートするコマンドレットです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするコマンドレットがない場合は、エントリを削除しないで空の配列を使用してください。
    CmdletsToExport   = @()

    # このモジュールからエクスポートする変数
    VariablesToExport = '*'

    # このモジュールからエクスポートするエイリアスです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするエイリアスがない場合は、エントリを削除しないで空の配列を使用してください。
    AliasesToExport   = @()

    # このモジュールからエクスポートする DSC リソース
    # DscResourcesToExport = @()

    # このモジュールに同梱されているすべてのモジュールのリスト
    # ModuleList = @()

    # このモジュールに同梱されているすべてのファイルのリスト
    # FileList = @()

    # RootModule/ModuleToProcess に指定されているモジュールに渡すプライベート データ。これには、PowerShell で使用される追加のモジュール メタデータを含む PSData ハッシュテーブルが含まれる場合もあります。
    PrivateData       = @{

        PSData = @{

            # このモジュールに適用されているタグ。オンライン ギャラリーでモジュールを検出する際に役立ちます。
            # Tags = @()

            # このモジュールのライセンスの URL。
            # LicenseUri = ''

            # このプロジェクトのメイン Web サイトの URL。
            # ProjectUri = ''

            # このモジュールを表すアイコンの URL。
            # IconUri = ''

            # このモジュールの ReleaseNotes
            # ReleaseNotes = ''

        } # PSData ハッシュテーブル終了

    } # PrivateData ハッシュテーブル終了

    # このモジュールの HelpInfo URI
    # HelpInfoURI = ''

    # このモジュールからエクスポートされたコマンドの既定のプレフィックス。既定のプレフィックスをオーバーライドする場合は、Import-Module -Prefix を使用します。
    # DefaultCommandPrefix = ''

}

Number.psm1

function Add-Number {
    param (
        $param1,
        $param2
    )
    return $param1 + $param2
}

function Sub-Number {
    param (
        $param1,
        $param2
    )
    return $param1 - $param2
}

実行例

  • Versionがpsd1ファイルで指定したものになっています
  • Add-NumberとSub-Numberの両方が、Exportされています
PS C:\Users\miajimyu> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOptio...


PS C:\Users\miajimyu> Import-Module Number
警告: モジュール 'Number'
からインポートされたコマンドの中には名前に承認されていない動詞を含むものがありこのようなコマンドは検出
される可能性が低くなる場合があります承認されていない動詞を含むコマンドを見つけるにはVerbose
パラメーターを使用してもう一度 Import-Module
コマンドを実行してください承認されている動詞の一覧を表示するには、「Get-Verbと入力してください
PS C:\Users\miajimyu> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare...
Script     1.0        Number                              {Add-Number, Sub-Number}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOptio...

注意点 Exportされる条件

psd1ファイルとpsm1ファイルの両方でExportされる必要があります。

psm1ファイルの中で、Export-ModuleMemberでExportを制限していると、
psd1ファイルでExportしようとしても、Exportされません。

function Add-Number {
    param (
        $param1,
        $param2
    )
    return $param1 + $param2
}

function Sub-Number {
    param (
        $param1,
        $param2
    )
    return $param1 - $param2
}

Export-ModuleMember -Function Add-Number # Changed Line
  • Add-Numberが、Exportされています
  • Sub-Numberが、Exportされていません
PS C:\Users\miajimyu> Import-Module Number
PS C:\Users\miajimyu> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare...
Script     1.0        Number                              Add-Number
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOptio...

#RequiredとModule

#Requiresでモジュールを指定すると、スクリプト実行時にインポートされます。
ModuleNameModuleVersionなどを指定できます。

準備

  • Numberモジュールがある状態
  • 以下のファイルを用意

script.ps1

#Requires -Modules @{ ModuleName = "Number"; ModuleVersion = "1.0"}

Get-Module

実行例

script.ps1内のGet-Moduleの出力でNumberモジュールがあります。

PS C:\Users\miajimyu\Desktop> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLi...


PS C:\Users\miajimyu\Desktop> .\script.ps1

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     1.0        Number                              Add-Number
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLi...

参考リンク


スポンサーリンク