PowerShellでもほかのプログラミング言語のようなモジュール化ができるようになっています。
また、.NETのパッケージも利用できるようになっています。
PowerShellでFunction (関数や、メソッドなど書くサブルーチンのようなもの)を使用するには、メインプログラムの前に先に記述しておかなければなりません。これは、どうもPowerShellが、一行ごとに中間言語にコンパイルしながら実行できるようになっているのではないかと思う仕様で、推測ですが、先にFunctionの定義がコンパイルされていないとメインプログラムがコンパイルエラーを起こすからではないかと思います。
いずれにしても、メインプログラムが、最後に記述されたようになるので見づらいです。
そこでモジュールという方法で、このFunctionをまとめておいて、どのプログラムでも利用できるにしてしまう方法が用意されています。
汎用性のある関数などを作って、モジュール化しておくと、とても便利ですし、プログラム再利用も行いやすいので利用したほうが良いと思います。
ただ、少し設定が複雑なので慣れる必要がありますが、慣れれば、非常に便利だと思います。
また、PowerShell Gallery で管理されているモジュールも同じように作られており、また、Import-Moduleコマンドレットで利用できるようになっています。
PowerShell コンテンツの中央リポジトリなっていてMicrosoftや、PowerShellコミュニティで作成されているそうです
モジュールは、フォルダー単位で構成します。
./module_name/
./module_name/modul_name.psd1
./module_name/module_name.psm1
./module_name/function_program1.ps1
./module_name/function_program2.ps1
./module_name/function_program3.ps1
・
・
・
上記のような感じです
1.モジュール名のフォルダー「Module_Name」を作成します
2.モジュール名と同じファイル名に拡張子「.psd1」のテキストファイルを作成します、文字コードはutf-8です。
psd1は、モジュールマニフェストファイルといって、このモジュールに関する情報と記述するファイルです。
マニフェストに記述する情報はModuleVersion 番号以外がすべて省略できるとMicrosoftのサイトには書かれています。
要素や、記述例なども書かれていますので参照ください。➡PowerShell モジュール マニフェストを記述する方法
以下は例です
@{
# モジュールのバージョン
ModuleVersion = '1.0.0'
# モジュールの説明
Description = 'Csvファイル操作を行うための関数群です'
# モジュールのファイル
RootModule = 'csv_module.psm1'
}
3.モジュール名と同じファイル名に拡張子「.psm1」のテキストファイルを作成します、文字コードはutf-8です。
psm1は、モジュールのスクリプトを記述します。
ここには、実際に関数などFunctionでスクリプトを記述します。
通常と違うのは最後に「Export-ModuleMember -Function ’Function-Name'」の記述が必要なことです。
この記述で「Function-Name」という関数が、ps1で作成するスクリプトから参照できるようになります。
しかしこの方法ですと複数の関数を一度に登録したい場合、psm1内に複数の関数と記述することになり、管理もしにくくなります。
そこでこのpsm1ファイルでは、1つずつ作成した関数ファイル(拡張子「ps1」)を管理するスクリプトファイルと位置づけます。
具体的には以下のような記述にして使用します。
#モジュールのあるパスを抽出
$myFullPath=$MyInvocation.MyCommand.Path
$myPath=Split-Path -Parent $myFullPath
# 関数ファイルの読み込み
. $myPath\function_program1.ps1
. $myPath\function_program2.ps1
. $myPath\function_program3.ps1
# エクスポートする関数のリスト
Export-ModuleMember -Function function_program1
Export-ModuleMember -Function function_program2
Export-ModuleMember -Function function_program3
4.モジュールに追加したい関数(Fuction)名に拡張子「.ps1」のファイルを作成する。文字コードはutf-8です。
これは、再利用で使用したい関数が記述されたスクリプトファイルになります。
注意することは、関数名とファイル名を一致させておくことです。これにより「.psm1」のファイルの管理が楽になりますし、
各々の関数を記述したスクリプトファイルの管理もファイル名で一目瞭然であり楽になります。
以下は関数スクリプトファイルの例です。
#------------------------------------------------------------
# 関数名 functio_program1
#------------------------------------------------------------
function fuction_program1 {
# 関数スクリプトを記述
}
#--------------------------------------------------------------------------
#For test script as below
$Debug=$false
#$Debug=$True #<-コメントアウトを外してやればデバッグ処理ができる
if($Debug){
#ここにデバッグ用のスクリプトを記述し上記の関数が正常に動作するか確認する
Write-Host function_program1
}
私の場合、各PS1のプログラムには、上記のようにデバッグ用スクリプトも追記して利用してます。
モジュールを利用できるようにするには少し面倒です。
ここでは、自作のモジュールを汎用的に使用できるようにインストールする方法を記述します。
モジュールを利用できるようにするには、Powershellがモジュールを確認できるパスの通った場所に保管する必要があります。
通常ですと環境変数$PROFILEに記されている環境ファイルのある場所に作られたModulesフォルダーにモジュールをパスごとコピーします。
ちなみにこの環境ファイルは、初期値では存在していない場合があります。その場合は、
New-Item -Type File -Path $PROFILE -Force
を実行することで生成されます。これは、Poweshellを起動時に必ず実行してほしいスクリプトを記述できます。
例えば
ここにImport-Module module_nameと記述しておくと、いつでもモジュール登録した、関数が使用できるようになります。
$PROFILE変数に書かれているファイル名は、標準で「Microsoft.PowerShell_profile.ps1」となっており、
常時使う関数をモジュール化して、このプロファイルで読み出すようにしています。
以下その記述の例です。
Microsoft.PowerShell_profile.ps1
Push-location
Import-Module module_name
Pop-Location
モジュールの中で作業パスを移動しているのでPush-locationとPop-Locationを使用して、パスが変更されたままにならないようにしています。
私の場合、モジュールを作成したパスにインストール、アンインストール用のスクリプトを追加しています。
モジュールは、フォルダー単位で構成します。
./module_name/
./module_name/modul_name.psd1
./module_name/module_name.psm1
./module_name/function_program1.ps1
./module_name/function_program2.ps1
./module_name/function_program3.ps1
・
./module_name/insall.ps1
./module_name/uninstall.ps1
書いてある内容ですが、
insall.ps1
# モジュール名
$ModuleName = "module_name"
# モジュール Path
$ModulePath = Join-Path (Split-Path $PROFILE -Parent) "Modules"
# モジュールを配置する Path
$NewPath = Join-Path $ModulePath $ModuleName
# ディレクトリ作成
if( -not (Test-Path $NewPath)){
md $NewPath
}
# モジュールのコピー
$ModuleFileName = Join-Path $PSScriptRoot "*"
copy $ModuleFileName $NewPath
Import-Module $ModuleName
uninstall.ps1
# モジュール名
$ModuleName = "module_name"
# モジュールを削除
Remove-Module $ModuleName
# モジュール Path
$ModulePath = Join-Path (Split-Path $PROFILE -Parent) "Modules"
# モジュールが配置されている Path
$RemovePath = Join-Path $ModulePath $ModuleName
# ディレクトリ削除
if( Test-Path $RemovePath ){
Remove-Item $RemovePath -Force -Recurse
}
Powershellがモジュールを確認できるパスの通った場所に保管するのに、このインストールスクリプトを使用して追加します。
削除する場合はアンインストールスクリプトを使用します。
こうすることで開発時は違う場所で作成しても容易に利用できる環境にインストールできると思います。
モジュールの作成が完了したら、Install.ps1を実行します。
モジュールフォルダーとその中のファイルは、$PROFILEに記されているパス内の Modulesフォルダー内にコピーされているのが確認できると思います。また、Get-Module を実行するとで使えるようになっていることが確認できます。