「PowerShellで使えるモジュールを確認したい」
「インストール済みのモジュール一覧を表示する方法がわからない」
「モジュールの管理方法を体系的に学びたい」
PowerShellを効果的に活用するには、モジュールの管理が重要です。モジュールを適切に管理することで、作業効率を大幅に向上させ、より高度な自動化を実現できます。
この記事では、PowerShellモジュールの確認から管理までを包括的に解説し、実務で即座に活用できる具体的な方法を提供します。
PowerShellモジュールの基礎知識

モジュールとは
PowerShellモジュールは、関連するコマンドレット、関数、変数、エイリアスなどをパッケージ化した再利用可能な単位です。
.psm1
ファイルまたはディレクトリ構造として配布され、PowerShellの機能を拡張します。
モジュールの種類
スクリプトモジュール
.psm1
ファイルとして配布- PowerShellスクリプトで記述
- 最も一般的なタイプ
マニフェストモジュール
.psd1
ファイル(マニフェスト)付き- モジュールのメタデータを含む
- バージョン管理や依存関係を定義
バイナリモジュール
.dll
ファイルとして配布- C#などで開発されたコンパイル済みモジュール
- 高性能が要求される用途
動的モジュール
- メモリ上で動的に作成
New-Module
コマンドで作成
モジュールのスコープ
AllUsers
- 全ユーザーが利用可能
- 管理者権限でインストール
C:\Program Files\WindowsPowerShell\Modules
CurrentUser
- 現在のユーザーのみ利用可能
- 一般ユーザー権限でインストール可能
C:\Users\<Username>\Documents\WindowsPowerShell\Modules
インストール済みモジュールの確認方法

PowerShellGet経由でインストールされたモジュール
基本的な確認
# インストール済みモジュールの一覧表示
Get-InstalledModule
# 詳細情報付きで表示
Get-InstalledModule | Format-Table Name, Version, Repository, InstalledDate -AutoSize
# 特定のモジュールを検索
Get-InstalledModule -Name "*Azure*"
出力例
Name Version Repository InstalledDate
---- ------- ---------- -------------
Az.Accounts 2.8.0 PSGallery 2023/05/15 10:30:00
Az.Profile 1.2.1 PSGallery 2023/05/15 10:31:00
PSReadLine 2.2.6 PSGallery 2023/04/20 14:15:00
詳細情報の取得
# 特定のモジュールの詳細情報
Get-InstalledModule -Name "Az.Accounts" | Format-List
# インストール場所を含む詳細情報
Get-InstalledModule | Select-Object Name, Version, InstalledLocation
複数バージョンのモジュール確認
# 同じモジュールの複数バージョンを確認
Get-InstalledModule -Name "Az.Accounts" -AllVersions
# 古いバージョンを特定
Get-InstalledModule | Group-Object Name | Where-Object {$_.Count -gt 1}
利用可能なモジュールの確認

現在読み込み可能なモジュール
基本的な確認
# 利用可能なすべてのモジュール
Get-Module -ListAvailable
# 名前でフィルタリング
Get-Module -ListAvailable -Name "*Exchange*"
# インストール場所別に確認
Get-Module -ListAvailable | Group-Object ModuleBase | Format-Table Count, Name -AutoSize
現在読み込まれているモジュール
# 現在のセッションで読み込まれているモジュール
Get-Module
# モジュールの詳細情報
Get-Module | Select-Object Name, Version, ModuleType, ExportedCommands
モジュールの状態確認
# モジュールが読み込まれているかチェック
function Test-ModuleLoaded {
param([string]$ModuleName)
if (Get-Module -Name $ModuleName) {
Write-Host "$ModuleName は読み込まれています" -ForegroundColor Green
} else {
Write-Host "$ModuleName は読み込まれていません" -ForegroundColor Yellow
}
}
# 使用例
Test-ModuleLoaded "Az.Accounts"
モジュールの検索とインストール

PowerShell Galleryでの検索
基本的な検索
# モジュール名で検索
Find-Module -Name "*Azure*"
# タグで検索
Find-Module -Tag "Azure", "Cloud"
# 作者で検索
Find-Module -Author "Microsoft"
# 説明文で検索
Find-Module | Where-Object {$_.Description -like "*REST API*"}
詳細な検索条件
# バージョン指定での検索
Find-Module -Name "Az.Accounts" -RequiredVersion "2.8.0"
# 最小バージョン指定
Find-Module -Name "Az.Accounts" -MinimumVersion "2.0.0"
# プレリリース版を含む検索
Find-Module -Name "Az.Accounts" -AllowPrerelease
モジュールのインストール
基本的なインストール
# 最新版をインストール
Install-Module -Name "Az.Accounts"
# 特定バージョンをインストール
Install-Module -Name "Az.Accounts" -RequiredVersion "2.8.0"
# 現在のユーザースコープにインストール
Install-Module -Name "Az.Accounts" -Scope CurrentUser
# 強制インストール(確認なし)
Install-Module -Name "Az.Accounts" -Force
一括インストール
# 複数モジュールの一括インストール
$modules = @("Az.Accounts", "Az.Resources", "PSReadLine")
$modules | ForEach-Object {
if (!(Get-InstalledModule -Name $_ -ErrorAction SilentlyContinue)) {
Install-Module -Name $_ -Scope CurrentUser -Force
Write-Host "$_ をインストールしました" -ForegroundColor Green
} else {
Write-Host "$_ は既にインストールされています" -ForegroundColor Yellow
}
}
モジュールの更新と削除
更新
# すべてのモジュールを更新
Update-Module
# 特定のモジュールを更新
Update-Module -Name "Az.Accounts"
# 更新可能なモジュールを確認
Get-InstalledModule | ForEach-Object {
$latest = Find-Module -Name $_.Name -ErrorAction SilentlyContinue
if ($latest -and [version]$latest.Version -gt [version]$_.Version) {
[PSCustomObject]@{
Name = $_.Name
InstalledVersion = $_.Version
LatestVersion = $latest.Version
NeedsUpdate = $true
}
}
}
削除
# モジュールの削除
Uninstall-Module -Name "Az.Accounts"
# 特定バージョンの削除
Uninstall-Module -Name "Az.Accounts" -RequiredVersion "2.7.0"
# 古いバージョンを一括削除
Get-InstalledModule | ForEach-Object {
$latest = Get-InstalledModule -Name $_.Name
Get-InstalledModule -Name $_.Name -AllVersions |
Where-Object {$_.Version -ne $latest.Version} |
Uninstall-Module -Force
}
モジュールの詳細情報取得

モジュール情報の詳細表示
# モジュールの基本情報
Get-Module -Name "Az.Accounts" -ListAvailable | Format-List
# モジュールのコマンド一覧
Get-Command -Module "Az.Accounts"
# モジュールの関数のみ表示
Get-Command -Module "Az.Accounts" -CommandType Function
# エクスポートされるコマンドの数をカウント
(Get-Module -Name "Az.Accounts" -ListAvailable).ExportedCommands.Count
モジュールの依存関係確認
# モジュールの依存関係を確認
function Get-ModuleDependencies {
param([string]$ModuleName)
$module = Get-InstalledModule -Name $ModuleName -ErrorAction SilentlyContinue
if ($module) {
$manifest = Import-PowerShellDataFile -Path (Join-Path $module.InstalledLocation "$ModuleName.psd1")
if ($manifest.RequiredModules) {
Write-Host "依存モジュール:" -ForegroundColor Cyan
$manifest.RequiredModules | ForEach-Object {
Write-Host " - $_" -ForegroundColor White
}
} else {
Write-Host "依存モジュールはありません" -ForegroundColor Green
}
}
}
# 使用例
Get-ModuleDependencies "Az.Accounts"
モジュールのヘルプ情報
# モジュールのヘルプを表示
Get-Help about_Modules
# 特定のコマンドのヘルプ
Get-Help Get-AzContext -Detailed
# モジュール内のすべてのコマンドのヘルプを更新
Update-Help -Module "Az.Accounts"
モジュールの場所とパス管理

モジュールパスの確認
# PowerShellモジュールパスの確認
$env:PSModulePath -split [System.IO.Path]::PathSeparator
# わかりやすく表示
$env:PSModulePath -split [System.IO.Path]::PathSeparator | ForEach-Object {
[PSCustomObject]@{
Path = $_
Exists = Test-Path $_
Type = if ($_ -like "*Program Files*") {"System"}
elseif ($_ -like "*Documents*") {"User"}
else {"Other"}
}
} | Format-Table -AutoSize
モジュールの物理的な場所
# インストールされたモジュールの場所を確認
Get-InstalledModule | Select-Object Name, InstalledLocation | Format-Table -AutoSize
# 特定のモジュールの場所
(Get-Module -Name "Az.Accounts" -ListAvailable).ModuleBase
# システム内のすべてのモジュールディレクトリを検索
Get-ChildItem -Path ($env:PSModulePath -split [System.IO.Path]::PathSeparator) -Directory -ErrorAction SilentlyContinue |
Select-Object Name, FullName |
Sort-Object Name
カスタムモジュールパスの追加
# 一時的にモジュールパスを追加
$customPath = "C:\MyModules"
$env:PSModulePath = $env:PSModulePath + [System.IO.Path]::PathSeparator + $customPath
# 永続的にモジュールパスを追加(レジストリ経由)
$currentPath = [Environment]::GetEnvironmentVariable("PSModulePath", "User")
$newPath = $currentPath + [System.IO.Path]::PathSeparator + "C:\MyModules"
[Environment]::SetEnvironmentVariable("PSModulePath", $newPath, "User")
モジュールのトラブルシューティング(よくある問題と解決方法)

問題1: モジュールが見つからない
# モジュールパスの確認
Write-Host "モジュールパス:" -ForegroundColor Cyan
$env:PSModulePath -split [System.IO.Path]::PathSeparator
# モジュールの存在確認
$moduleName = "Az.Accounts"
if (Get-Module -Name $moduleName -ListAvailable) {
Write-Host "$moduleName は利用可能です" -ForegroundColor Green
} else {
Write-Host "$moduleName が見つかりません" -ForegroundColor Red
Write-Host "インストールを試行します..." -ForegroundColor Yellow
Install-Module -Name $moduleName -Scope CurrentUser -Force
}
問題2: バージョンの競合
# 同じモジュールの複数バージョンを確認
Get-InstalledModule -AllVersions | Group-Object Name | Where-Object {$_.Count -gt 1} |
ForEach-Object {
Write-Host "モジュール: $($_.Name)" -ForegroundColor Yellow
$_.Group | Sort-Object Version -Descending | ForEach-Object {
Write-Host " バージョン: $($_.Version) - $($_.InstalledDate)" -ForegroundColor White
}
}
問題3: 実行ポリシーの問題
# 現在の実行ポリシーを確認
Get-ExecutionPolicy -List
# 安全な実行ポリシーの設定
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 特定のファイルのブロックを解除
Unblock-File -Path "C:\Path\To\Module.psm1"
モジュールの整合性チェック
function Test-ModuleIntegrity {
param([string]$ModuleName)
try {
$module = Get-InstalledModule -Name $ModuleName -ErrorAction Stop
Write-Host "モジュール '$ModuleName' の整合性をチェック中..." -ForegroundColor Cyan
# モジュールファイルの存在確認
$moduleFile = Join-Path $module.InstalledLocation "$ModuleName.psm1"
if (Test-Path $moduleFile) {
Write-Host "✓ モジュールファイル: OK" -ForegroundColor Green
} else {
Write-Host "✗ モジュールファイル: 見つかりません" -ForegroundColor Red
}
# マニフェストファイルの確認
$manifestFile = Join-Path $module.InstalledLocation "$ModuleName.psd1"
if (Test-Path $manifestFile) {
Write-Host "✓ マニフェストファイル: OK" -ForegroundColor Green
# マニフェストの内容検証
try {
$manifest = Import-PowerShellDataFile -Path $manifestFile
Write-Host "✓ マニフェスト内容: OK" -ForegroundColor Green
} catch {
Write-Host "✗ マニフェスト内容: エラー" -ForegroundColor Red
Write-Host " $_" -ForegroundColor Red
}
}
# モジュールの読み込みテスト
try {
Import-Module -Name $ModuleName -Force -ErrorAction Stop
Write-Host "✓ モジュール読み込み: OK" -ForegroundColor Green
Remove-Module -Name $ModuleName -Force
} catch {
Write-Host "✗ モジュール読み込み: エラー" -ForegroundColor Red
Write-Host " $_" -ForegroundColor Red
}
} catch {
Write-Host "エラー: $_" -ForegroundColor Red
}
}
# 使用例
Test-ModuleIntegrity "Az.Accounts"
実践的な使用例

モジュール管理スクリプト
# モジュール管理用の包括的なスクリプト
function Manage-PowerShellModules {
param(
[Parameter(Mandatory)]
[ValidateSet("List", "Update", "Clean", "Report")]
[string]$Action
)
switch ($Action) {
"List" {
Write-Host "=== インストール済みモジュール一覧 ===" -ForegroundColor Cyan
Get-InstalledModule | Sort-Object Name | Format-Table Name, Version, Repository -AutoSize
}
"Update" {
Write-Host "=== モジュールの更新チェック ===" -ForegroundColor Cyan
$outdatedModules = @()
Get-InstalledModule | ForEach-Object {
$installed = $_
$latest = Find-Module -Name $_.Name -ErrorAction SilentlyContinue
if ($latest -and [version]$latest.Version -gt [version]$installed.Version) {
$outdatedModules += [PSCustomObject]@{
Name = $installed.Name
InstalledVersion = $installed.Version
LatestVersion = $latest.Version
}
}
}
if ($outdatedModules) {
$outdatedModules | Format-Table -AutoSize
$response = Read-Host "これらのモジュールを更新しますか? (Y/N)"
if ($response -eq 'Y' -or $response -eq 'y') {
$outdatedModules | ForEach-Object {
Update-Module -Name $_.Name -Force
Write-Host "$($_.Name) を更新しました" -ForegroundColor Green
}
}
} else {
Write-Host "すべてのモジュールが最新です" -ForegroundColor Green
}
}
"Clean" {
Write-Host "=== 古いバージョンのクリーンアップ ===" -ForegroundColor Cyan
Get-InstalledModule | ForEach-Object {
$moduleName = $_.Name
$allVersions = Get-InstalledModule -Name $moduleName -AllVersions
if ($allVersions.Count -gt 1) {
$latest = $allVersions | Sort-Object Version -Descending | Select-Object -First 1
$oldVersions = $allVersions | Where-Object {$_.Version -ne $latest.Version}
Write-Host "モジュール '$moduleName' の古いバージョンを削除中..." -ForegroundColor Yellow
$oldVersions | ForEach-Object {
Uninstall-Module -Name $_.Name -RequiredVersion $_.Version -Force
Write-Host " バージョン $($_.Version) を削除しました" -ForegroundColor Gray
}
}
}
}
"Report" {
Write-Host "=== PowerShellモジュール環境レポート ===" -ForegroundColor Cyan
# PowerShellバージョン
Write-Host "PowerShellバージョン: $($PSVersionTable.PSVersion)" -ForegroundColor White
# モジュールパス
Write-Host "`nモジュールパス:" -ForegroundColor White
$env:PSModulePath -split [System.IO.Path]::PathSeparator | ForEach-Object {
$exists = Test-Path $_
$color = if ($exists) {"Green"} else {"Red"}
Write-Host " $_ (存在: $exists)" -ForegroundColor $color
}
# インストール済みモジュール数
$installedCount = (Get-InstalledModule).Count
Write-Host "`nインストール済みモジュール数: $installedCount" -ForegroundColor White
# 利用可能なモジュール数
$availableCount = (Get-Module -ListAvailable).Count
Write-Host "利用可能なモジュール数: $availableCount" -ForegroundColor White
# 現在読み込まれているモジュール数
$loadedCount = (Get-Module).Count
Write-Host "読み込み済みモジュール数: $loadedCount" -ForegroundColor White
}
}
}
# 使用例
# Manage-PowerShellModules -Action "Report"
# Manage-PowerShellModules -Action "List"
# Manage-PowerShellModules -Action "Update"
# Manage-PowerShellModules -Action "Clean"
必須モジュールの自動インストール
# 必須モジュールの定義と自動インストール
$RequiredModules = @(
@{Name="Az.Accounts"; MinVersion="2.8.0"},
@{Name="PSReadLine"; MinVersion="2.2.0"},
@{Name="PowerShellGet"; MinVersion="2.2.5"},
@{Name="ImportExcel"; MinVersion="7.8.0"}
)
function Install-RequiredModules {
param([array]$Modules)
Write-Host "必須モジュールのチェックを開始します..." -ForegroundColor Cyan
foreach ($module in $Modules) {
$installed = Get-InstalledModule -Name $module.Name -ErrorAction SilentlyContinue
if (!$installed) {
Write-Host "$($module.Name) をインストール中..." -ForegroundColor Yellow
Install-Module -Name $module.Name -Scope CurrentUser -Force
Write-Host "$($module.Name) をインストールしました" -ForegroundColor Green
} elseif ($module.MinVersion -and [version]$installed.Version -lt [version]$module.MinVersion) {
Write-Host "$($module.Name) を更新中..." -ForegroundColor Yellow
Update-Module -Name $module.Name -Force
Write-Host "$($module.Name) を更新しました" -ForegroundColor Green
} else {
Write-Host "$($module.Name) は既に要件を満たしています" -ForegroundColor Green
}
}
Write-Host "必須モジュールのチェックが完了しました" -ForegroundColor Cyan
}
# 実行
Install-RequiredModules -Modules $RequiredModules
まとめ
PowerShellモジュールの管理は、効率的な自動化とスクリプト開発の基盤となる重要なスキルです。
適切なモジュール管理により、作業効率の向上と環境の安定性を同時に実現できます。
重要なポイント
- 定期的なモジュール確認:
Get-InstalledModule
とGet-Module -ListAvailable
の使い分け - 計画的な更新:
Update-Module
による定期的なアップデート - 環境の整理:古いバージョンの削除によるディスク容量とパフォーマンスの最適化
- 依存関係の理解:モジュール間の関係性の把握
- トラブルシューティング:問題発生時の系統的な対処法
コメント