大規模な PowerShell モジュールは Install-Module での導入がオススメです

Last Update: feedback 共有

本記事は、マイクロソフト社員によって公開されております。

こんにちは、Windows サポートチームの中森です。

今回は PowerShell Gallery に公開される大規模なモジュールの導入には、
オンラインでの Install-Module をオススメしている情報を、ご紹介いたします。

はじめに

Install-Module は PowerShell Gallery から、指定されたモジュールを検索、ダウンロード、インストールを行うコマンドレットです。
PowerShell Gallery からモジュールをインストールするために必要な設定 は、別記事で紹介しております。

大規模なモジュールを Import-Module しようすると

一例となりますが Microsoft より公開している PowerShell モジュールの Az モジュールや、 Microsoft.Graph モジュールなどは、
多くの有益なコマンドレットを有しており、モジュールを導入した際に、登録されるコマンドレットの数は、大変多くなります。

Windows PowerShell では、このような大規模な PowerShell モジュールを Import-Module を用いて導入しますと、
以下のようなエラーが生じる場合がございます。

Import-Module 時に表示されるエラー メッセージの一例

1
2
3
4
5
6
7
8
PS > Import-Module Microsoft.Graph

Import-Module : 関数の容量 4096 がこのスコープを超えているため、関数 New-MgGroupDriveRootListItemVersion を作成できません。
発生場所 行:1 文字:1
+ Import-Module Microsoft.Graph
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (New-MgGroupDriveRootListItemVersion:String) [Import-Module]、SessionStateOverflowException
+ FullyQualifiedErrorId : FunctionOverflow,Microsoft.PowerShell.Commands.ImportModuleCommand

エラーが生じる原因

Windows PowerShell では、 1 セッションのうち利用できる関数 (Function) の数の上限を変数 $MaximumFunctionCount にて制御しており、既定では 4096 となります。
Import-Module にて PowerShell モジュールを導入しますと、この $MaximumFunctionCount で管理する関数の数にカウントされ 4096 を超えた場合にエラーが生じます。

対処方法

Install-Module では、本事象は発生しませんので、Install-Module を、ご利用いただくことを推奨いたします。
単機能のモジュールであれば、今回のような制限が生じるほど大規模な関数 (Function) 数とならないですが、クラウド製品に対し提供されるモジュールは、大規模な関数数となる傾向がございます。
クラウド製品に対する PowerShell モジュールのご利用にはインターネット (オンライン) への接続が必須となりますため、Install-Module も利用可能でございます。

回避方法

なお、 Install-Module をご利用できない環境で、大規模な PowerShell モジュールのオフライン導入が必要な場合、
以下のように、 $MaximumFunctionCount を変更することで、エラーを回避することも可能でございます。
ただ、$MaximumFunctionCount を無制限に変更することはできませんため、変更に伴うトラブルが
発生する可能性もございますので、上記の [対処方法] を強く推奨いたします。

1
2
3
4
5
//変数 $MaximumFunctionCount の値を 2 倍に設定する (一例)。
PS> $MaximumFunctionCount = 8192

// 関数が 4096 以上のモジュールを Import-Module する (一例)。
PS> Import-Module Microsoft.Graph

なお、モジュールによっては、一例で説明した 8192 以上に関数が存在する場合もございますので、
導入するモジュールに必要な数値を設定いただけますと幸いでございます。

参考情報

回避方法は、 Import-Module の実行前に、毎回実行する必要がございます。
Windows PowerShell では、プロセス起動時に事前に、予め定められたコマンドを実行しておくプロファイルという機能がございます。

以下のような $MaximumFunctionCount の変更を記述した Profile.ps1 ファイルを作成し、
C:\Windows\System32\WindowsPowerShell\v1.0 フォルダーなどに配置することで反映されます。

1
$MaximumFunctionCount = 8192

関連記事

PowerShell Gallery
https://www.powershellgallery.com/

about_Preference_Variables / $MaximumFunctionCount
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-5.1

PowerShell のプロファイルについて
https://docs.microsoft.com/ja-JP/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.2

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。