📒

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 スクリプトを読み込む場合もモジュールをインポートする場合もどちらもグローバルスコープから定義される関数を使用できるようになるのは同じ。
しかし関数が定義されるスコープは前者はグローバル スコープ、後者はモジュールのスコープである。

脚注
  1. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_pssessions?view=powershell-7.5#what-is-a-session ↩︎

  2. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#powershell-scope-names ↩︎ ↩︎

  3. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#parent-and-child-scopes ↩︎

  4. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#scope-rules ↩︎

  5. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.5#modules ↩︎

Discussion