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

PowerShell の関数をモジュールとしてインストールする


PowerShell の関数を Profile に登録するのはお手軽ですが、多くの関数を Profile に書いてしまうと見通しが悪くなってしまいます。

そんな時は、関数をモジュールにして登録するのがお手軽です。

モジュールは .psm1 の拡張子を持つスクリプトで、.ps1 と同じように BOM 付き UTF-8 で書きます。

例えば「hoge.psm1」とモジュールを作った場合は、モジュールディレクトリにモジュール名と同じ「hoge」ディレクトリを作成します。

モジュールディレクトリは、Profile があるディレクトリのサブディレクトリ「Modules」です。

Windows PowerShell 5.x C:\Users\<User Name>\Documents\WindowsPowerShell\Modules\
PowerShell Core 6.0 以降 C:\Users\<User Name>\Documents\PowerShell\Modules

PowerShell 的に書けばこんな感じですね。

$ModulePath = Join-Path (Split-Path $PROFILE -Parent) "Modules"

ここに「hoge」フォルダを作成し、「hoge.psm1」を配置します。

 

この仕様は、Windows PowerShell 5.x も、 PowerShell Core 6 以降も同じなので、汎用インストーラーを作成することが出来ます。

インストーラー(install.ps1)

# モジュール名
$ModuleName = "hoge"

# モジュール 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 ($ModuleName + ".psm1")

copy $ModuleFileName $NewPath

 

アンインストールは、ディレクトリを削除すればいいので、こちらも汎用アンインストーラーが書けますね

アンインストーラー(uninstall.ps1)

# モジュール名
$ModuleName = "hoge"

# モジュール 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 の実行プログラムのあるディレクトにあります

Windows PowerShell 5.x C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
PowerShell Core 6 C:\Program Files\PowerShell\6\Modules
PowerShell Core 7-preview C:\Program Files\PowerShell\7-preview\Modules

 

関連情報

関数を PowerShell プロンプトで実行する
https://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.