🗂

Get-InstalledModule と Get-Module の違い

2023/05/02に公開

完全に自分向けのメモであり、まぁ言われてみれば当たり前の話を書いているのですが、意外と、あ、そういう動きをするのね、というのがわかりやすく紹介できると思ったので書いておきます。
結論としては Get-Module はあんまり大事じゃなくて、Get-InstalledModule が大事、という話を書いてます。


Get-InstalledModuleGet-Module の違い

Get-InstalledModule はシステムに install されている module を列挙します。(当たり前の話を書いてるんですが、はい)
以下は自分のマシンでの例で、一部出力を省略していますが、79 個の module が install されていることがわかります。

> Get-InstalledModule

Version              Name                                Repository           Description
-------              ----                                ----------           -----------
9.2.0                Az                                  PSGallery            Microsoft Azure PowerShell - Cmdlets to …
2.10.4               Az.Accounts                         PSGallery            Microsoft Azure PowerShell - Accounts cr…
2.0.0                Az.Advisor                          PSGallery            Microsoft Azure PowerShell: Advisor cmdl…
<snip>

> (Get-InstalledModule).Count
79

次に Get-Module ですが、PowerShell を起動した時点で読み込まれている module を列挙します。

> Get-Module

ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Manifest   7.0.0.0               Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-Item, Clear-It…
Script     2.2.6                 PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption,

ここで、適当に Get-Module に入っていなさそうな cmdlet を実行してみます。

> Get-AzContext

Name                                     Account             SubscriptionName    Environment         TenantId
----                                     -------             ----------------    -----------         --------
xxxxxxxxxxxx (xxxxxxxx-xxxx-xxxx-...     xxxxxxxx@microso... xxxxxxxx            AzureCloud          xxxxxxxx-xxxx-x...

で、再度 Get-Module を実行してみると、先ほどの cmdlet が含まれている module が自動的に追加されています。
つまり、Get-Module は該当の PSSession で読み込まれている module を列挙するので、Get-InstalledModule とは別物ということですね。

> Get-Module

ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Script     2.10.4                Az.Accounts                         {Add-AzEnvironment, Clear-AzConfig, Clear-AzConte…
Manifest   7.0.0.0               Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-Item, Clear-It…
Manifest   7.0.0.0               Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Ob…
Script     1.4.8.1               PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package,…
Script     2.2.5                 PowerShellGet                       {Find-Command, Find-DscResource, Find-Module, Fin…
Script     2.2.6                 PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption,

なのでまぁ、Get-Module がどうであるかはどうでもよい話であって、Get-InstalledModule を見て module が install されているかどうかを確認すればよいということになるかと思います。

Install-Module してない module は Import-Module できない

これも当たり前の話なのですが、ちょうどいい log が取れたので参考までに張り付けておきます。

ThreadJob という module があるのですが、既定では入っていません。
で、それをおもむろに Import-Module してみると、エラーを吐きます。

> Import-Module ThreadJob
Import-Module : The specified module 'ThreadJob' was not loaded because no valid module file was found in any module
directory.
At line:1 char:1
+ Import-Module ThreadJob
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (ThreadJob:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

無いなら install すればいいだけなので Install-Module してみます。
-Scope CurrentUser を付ければ、管理者権限無しでも動くはずです。

> Install-Module -Name ThreadJob -Scope CurrentUser -Repository PSGallery

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y

ちなみにこの時点ではまだ Get-Module の一覧には出てこないみたいですね。

> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     2.0.0      PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...

で、install が終わっているはずなので Import-Module してから Get-Module すればちゃんと ThreadJob が表示されています、よかったね!

> Import-Module ThreadJob
> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con...
Script     2.0.0      PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...
Binary     2.0.3      ThreadJob                           Start-ThreadJob

ちなみに PSReadLine はおすすめの module の一つですのでぜひ使ってみてください!

https://zenn.dev/skmkzyk/articles/powershell-linux-key-bindings

Microsoft (有志)

Discussion