PowerShellスクリプトとモジュールの読み込み、スコープについての備忘録
こちらはYuruvent Advent Calendar 2025 1日目の記事です☃️
はじめに
PowerShellスクリプトの読み込み、モジュールのインポートとスコープについて調べたのでメモです。
スコープ?セッション?モジュール?そこらへんの関係について
- セッション[1]
- PowerShellの実行環境の単位
- PowerShell を起動するたびにセッションが作成される
- グローバルスコープ[2]
- PowerShell の起動時やセッション、実行空間(Runspace)の作成時に生成される
- セッション内で最も外側のスコープ
- 対話型シェルで直接コマンドを実行すると、基本的にこのスコープで処理される
- ローカルスコープ[2:1]
- 現在操作中のスコープのこと
- 親スコープと子スコープ[3][4]
- スコープは入れ子になる
- 外が親
- スクリプトまたは関数を呼び出すことで、新しい子スコープを作成でき、 呼び出し元のスコープは親スコープとなる
- 基本的に親スコープ内の項目は子スコープで使用できる
- 逆に子スコープ内の項目は親スコープからは基本的に使えない
- モジュール[5]
- コマンドレット、スクリプト、関数、変数などを含めることができるユニット
- 独自のスコープを持つ
- エクスポートされたメンバーはインポート元のグローバルスコープに公開され、インポート元のグローバルスコープから使えるようになる
ドット ソース表記を使用してPowerShell スクリプトを読み込む
スクリプトのパスの前にドットとスペースを入力する。
コマンド例
. C:\Users\testuser\work\Script.ps1
なにが起こるのか
指定したスクリプトが現在のスコープで実行されるため、スクリプト内で定義した関数などはそのスコープ内で利用可能になる。
対話型シェルでの通常操作はグローバルスコープが「現在のスコープ」なので、対話型シェルでドット ソース表記を使用してPowerShell スクリプトを読み込んだ場合、グローバルスコープで実行されることになり、定義された関数はそのグローバルスコープ下のスコープから使用できるようになる。
逆にスクリプトのパスのみを入力して実行した場合は、実行時に新たな子スコープ(スクリプトスコープ)が作成され、そこで処理が行われるため、定義された関数は実行終了後にグローバルスコープには残らない。
モジュールをインポートする
コマンド例
Import-Module C:\Users\testuser\work\module.psd1
なにが起こるのか
Export-ModuleMember でエクスポートされた関数などは、インポート元のグローバルスコープに公開され、モジュールのインポート元のグローバルスコープから参照可能になる。親スコープで使用できる項目は子スコープでも参照できるのでインポート元のグローバルスコープ下のスコープからも使用できるようになる。
対話型シェルにおける両者の違い
対話型シェルでドット ソース表記を使用してPowerShell スクリプトを読み込む場合もモジュールをインポートする場合もどちらもグローバルスコープから定義される関数を使用できるようになるのは同じ。
しかし関数が定義されるスコープは前者はグローバル スコープ、後者はモジュールのスコープである。
-
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_pssessions?view=powershell-7.5#what-is-a-session ↩︎
-
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#powershell-scope-names ↩︎ ↩︎
-
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#parent-and-child-scopes ↩︎
-
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#scope-rules ↩︎
-
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#modules ↩︎
Discussion