Home > Windows にまつわる e.t.c.

自作 PowerShell モジュールのインストーラー


PowerShell は、関数をモジュールとして登録すると、システム提供のコマンドレットと同様に使用することが可能です

ちょっとしたツールを関数として書いて、モジュールとして登録しておくとなかなか便利なのでお勧めです

 

モジュールの作成と登録

モジュールとして登録するには、以下を満たせば OK です

・関数を .psm1 に書く
・.psm1と同じ名前のディレクトリをモジュール ディレクトリに作成する
・作成したディレクトリに.psm1 をコピーする

たったこれだけです

 

.psm1 には複数の関数を書くことができます

例えば TestModule.psm1 を作成したとします

TestModule.psm1

function TestFunc1(){
    Write-Output "This is TestFunc 1"
}

function TestFunc2(){
    Write-Output "This is TestFunc 2"
}

 

次に、モジュール ディレクトリに新たなディレクトリ TestModule を作成します

Windows PowerShell であれば、以下がデフォルトのローカル モジュール ディレクトリとなっています
(「ローカル モジュール ディレクトリ」は正式名ではなく、便宜上僕が名付けたユーザーごとのモジュール ディレクトリです)

 

C:\Users\ユーザー名\Documents\WindowsPowerShell\Modules

 

ここに TestModule を作成し、TestModule.psm1 をコピーすれば、モジュールの登録完了です

 

TestFunc1 TestFunc2 が通常のコマンドレットと同様に使えるようになります

 

 

インストーラーの作成

ローカル モジュール ディレクトリは、Windows と Windows 外で異なっています

・Windows
$PROFILE ディレクトリ
(MS 公開ドキュメントは違う取得してます)

・Windows 以外
$HOME/.local/share/powershell/Modules

 

参考
PSModulePath について - PowerShell | Microsoft Learn

 

Windows 環境か、Windows 外かを判別するには、$PSVersionTable.Platform が 「Win32NT」(PowerShell)になっているか、値がセットされていない(Windows PowerShell)かで判定できます

これを踏まえ、インストーラーを .ps1 で書くとこんな感じになります

install.ps1

# Module Name
$ModuleName = "モジュール名"

# Module Path
if(($PSVersionTable.Platform -eq "Win32NT") -or ($PSVersionTable.Platform -eq $null)){
    $ModulePath = Join-Path (Split-Path $PROFILE -Parent) "Modules"
}
else{
    $ModulePath = Join-Path ($env:HOME) "/.local/share/powershell/Modules"
}
$NewPath = Join-Path $ModulePath $ModuleName

# Make Directory
if( -not (Test-Path $NewPath)){
    New-Item $NewPath -ItemType Directory -ErrorAction SilentlyContinue
}

# Copy Module
$ModuleFileName = Join-Path $PSScriptRoot ($ModuleName + ".psm1")
Copy-Item $ModuleFileName $NewPath

 

 

アンインストーラー

アンインストールは、作成したモジュールディレクトリを削除するだけなので、以下のように作ることができます

uninstall.ps1

# Module Name
$ModuleName = "モジュール名"

# Module Path
if(($PSVersionTable.Platform -eq "Win32NT") -or ($PSVersionTable.Platform -eq $null)){
    $ModulePath = Join-Path (Split-Path $PROFILE -Parent) "Modules"
}
else{
    $ModulePath = Join-Path ($env:HOME) "/.local/share/powershell/Modules"
}
$RemovePath = Join-Path $ModulePath $ModuleName

# Remove Direcory
if( Test-Path $RemovePath ){
    Remove-Item $RemovePath -Force -Recurse
}

 

 

GitHub リポジトリから直接インストール

GitHub 上に、公開リポジトリでモジュールを書いていれば、リポジトリの Clone 不要で直接モジュールインストールをすることができます

リポジトリに、.psm1、install.ps1、uninstall.ps1 を置くと、以下 URL からモジュールのダウンロードができるようになります

 

https://raw.githubusercontent.com/GitHubユーザー名/リポジトリ名/master/モジュール

 

例えば、GitHubユーザー名が「HogeHoge」、リポジトリ名が「TestModule」で、モジュール名も「TestModule」の場合、以下からダウンロードできます

 

https://raw.githubusercontent.com/HogeHoge/TestModule/master/TestModule.psm1
https://raw.githubusercontent.com/HogeHoge/TestModule/master/install.ps1
https://raw.githubusercontent.com/HogeHoge/TestModule/master/uninstall.ps1

 

ダウンロードは、Invoke-WebRequest を使えば良いので、プロファイル ディレクトリ(~/)に各ファイルをダウンロードするのであれば以下のように書くことができます

$ScriptName = "リポジトリ名"
$GitHubName = "GitHubユーザー名"
$Module = $ScriptName + ".psm1"
$Installer = "Install" + $ScriptName + ".ps1"
$UnInstaller = "UnInstall" + $ScriptName + ".ps1"
Invoke-WebRequest -Uri https://raw.githubusercontent.com/$GitHubName/$ScriptName/master/$Module -OutFile ~/$Module
Invoke-WebRequest -Uri https://raw.githubusercontent.com/$GitHubName/$ScriptName/master/install.ps1 -OutFile ~/$Installer
Invoke-WebRequest -Uri https://raw.githubusercontent.com/$GitHubName/$ScriptName/master/uninstall.ps1 -OutFile ~/$UnInstaller
& ~/$Installer
Remove-Item ~/$Module
Remove-Item ~/$Installer

 

これを PowerShell プロンプトにコピペすれば、GitHub から直接モジュールのインストールができます

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.