PowerShell のスナップインとモジュールの何が違うの?

twitter で「実はスナップインをImport-Moduleすることもできたりします。」というのを聞いて、「おお、そりゃそうか?」と思ったので、ちょろっと違いを調べなおしてみた。
スナップインは、

  • スナップインクラス
  • コマンドレット
  • プロバイダ

で構成されたアセンブリです。スナップインクラスはインストーラみたいなもので、スナップインを使用するためには、このスナップインクラスを登録する作業(=インストール)を行わなければなりません。標準のスナップインクラスから派生している場合、インストール作業は .NET Framework に付属の汎用アセンブリインストールユーティリティ (InstallUtil.exe) を使用することもできますし、アセンブリをコンソール アプリケーションとして作成して、セルフ インストールすることも簡単にできます。
モジュールは、

  • コマンドレット
  • プロバイダ
  • 変数
  • 関数
  • スクリプト
  • フォーマット ファイル等のリソース
  • 他のモジュールへの参照

にて構成されたアセンブリPowerShell Script です。また、動的生成することも可能になっています。スナップインクラスがなくなったことで、インストールという作業がなくなってコピーするだけで良いようになりました。また、格納可能なものが増えていろいろ便利になっています。例えばオブジェクトがコンソールに流れたときに表示される文字列表現を指定するフォーマット ファイルなんて、スナップインではスナップインクラスの登録処理の中でゴネゴネしないと難しかったものです。*1
スクリプトで作成できるようになったので、

function 良く使う関数 { ... }
Export-ModuleMember 良く使う関数

モジュール変数
Export-ModuleMember -Variable モジュール変数

みたいなスクリプトを作成して、ps1m という拡張子で保存しておけば、Import-Module してよく使う関数やモジュール変数を使用できるようになったりします。

*1:スナップインを Import-Module した際に、これらのインストール処理に含まれていた部分がうまく動かないことが想像されるため、スナップインはスナップインとして登録しておくのがよいのでしょうね