モジュール
コマンドレットや関数などを追加できる仕組み
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の中の、RootModule
とFunctionsToExport
を書き換える。
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
でモジュールを指定すると、スクリプト実行時にインポートされます。
ModuleName
やModuleVersion
などを指定できます。
準備
- 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...
参考リンク
- Understanding a Windows PowerShell Module | Microsoft Docs
- How to Write a PowerShell Script Module | Microsoft Docs
- PowerShell のモジュール詳解とモジュールへのコマンドレット配置手法を考える | tech.guitarrapc.com
- はじめてのPowerShellモジュール公開 | しばたテックブログ
- Building a PowerShell Module |RAMBLING COOKIE MONSTER
スポンサーリンク