Module

The system for adding cmdlets, functions, etc.

YouTube

Click here for a video explanation.

About PowerShellGet

You can use PowerShellGet cmdlets (Find-Module, Update-Module, etc.). You can import modules from PowerShell Gallery.

How to update PowerShellGet

# Example
Install-Module PowerShellGet -Force -Scope CurrentUser

About module

How to create and use modules in the local environment.

Step1 Check $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

# Formatted for easy viewing
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

Relationship between the location of the module and the target user

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

Step2 Create “folder” and “psm1 file with the same name as the folder”.

Number.psm1

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

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

Step3 Automatic import and execution of modules

Modules will be imported automatically when using cmdlets or functions.

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...

Control Export with Export-ModuleMember

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: Success
  • Sub-Number: Error
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 (specify the file path , specify the module name)

Modules can be imported expressly.
I will try two different examples here.

  • Import-Module to specify the module name
  • Import-Module to specify the file path

Preparation

Prepare the two modules.

  • The Number module placed in $env:PSModulePath above
  • Multi module of Desktop

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

Use Module Manifest.

Create a new ModuleManifest.

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

Edit ModuleManifest.

In Number.psd1, rewrite the RootModule and FunctionsToExport items.

RootModule        = 'Number.psm1'
# You can also specify them with NestedModules.
FunctionsToExport = '*'
# Make all functions public.

The result will be the following.

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
}

Execution example

  • The Version is set to the one specified in the psd1 file.
  • Both Add-Number and Sub-Number have been exported.
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...

Note: Exported conditions

The Function needs to be exported in both the psd1 file and the psm1 file.
If export is restricted in either the psd1 or psm1 file, it will not be exported.

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 is exported.
  • Sub-Number is not exported.
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

If you specify a module with #Requires, it will be imported when the script is executed.
You can specify the ModuleName, ModuleVersion, etc.

Preparation

  • Number module in place
  • Prepare the following files

script.ps1

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

Get-Module

Execution example

There is a Number module in the output of Get-Module in script.ps1.

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...
Last modified October 11, 2022: update (8216439)