参加させていただいています。これは2日目の記事となります。モジュール機構を利用するにあたり以下の2つに関して考えてみようと思います。4.0)をベースとしています。4.0を利用する方法を参考にしていただければ幸いです。PowerShellコードは再利用性を持って記述することが容易です。起動したときに自動的に読み込まれてほしいと思うようになります。毎回書くとか人間のすることではありません。ファンクションを記述するやり方があります。起動時に自動的に読み込まれるため、$Profileに記述したファンクションも自動的に実行され任意のタイミングで利用できるようになります。書き連ねるのは限界があります。どのファンクションが$profileに含まれたものなのか判断が困難であり、自作コマンドレットが秩序なく散らばる要因となりねません。2.0からはモジュール機構が実装されました。参照、読み込み、保持機構です。コマンドレット、プロバイダ、ファンクション、変数、エイリアスなどを持ることができます。モジュール機構を利用することで、一連のスクリプトやファンクションをモジュールとしてパッケージ化、読み込みできるようになります。モジュールに含まれるコマンドレットは自動的に探索され、インテリセンスでも候補に挙がります。そのコマンドレットを実行した時に、コマンドレットを含むモジュールも自動的に読み込まれます。ModuleNameプロパティでどのモジュールにそのファンクションが含まれるのか、あるいはそのモジュールに含まれるファンクションが何かを判断できます。おいてモジュールのコンセプトはタイプごとに4つあります。開発者や管理者はモジュールメンバーのファンクションや変数などを利用できます。アセンブリ(.dll)に含まれたコンパイルされたコードを指します。開発者はこのモジュールにCmdletやプロバイダ、あるいは既存のSnap-inも利用できます。ディスク(ファイル)として保持されていないものを指します。それぞれを細かく見ていきましょう。定義したものを指します。コマンド実行しながら考えましょう。モジュールパスにモジュールフォルダを作成するまず、ユーザーモジュールパス($env:USERPROFILE\Documents\WindowsPowerShell\Modules)にhogeフォルダを作ります。$env:USERPROFILE\Documents\WindowsPowerShell\Modules\hogeユーザーモジュールパスについては後段で説明します。hoge.psm1をモジュールフォルダ直下に作成します。モジュールファイル(.psm1)は必ずモジュールフォルダと同一名称にしてください。write-hosthoge.psm1記述内容についてここでやっていることはいたって簡単です。「モジュールの公開するファンクション」として出力しています。考えれば性質がわかりやすいかもしれません。内部のfunction同士では参照しあえます。(例えスクリプトファイル(.ps1)ごとに分離させてもドットソース読み込みしていれば同様です。出力することで、モジュール利用者が自由にコマンドレットを実行することができます。変数は選べるということです。特定のファンクションを公開したくない場合、function{}内部にそのfunction{}をネストして記述するなどして隠す必要がありますが、モジュールではExport-ModuleMemberで制御できます。起動して次のコマンドを入力してみてください。write-hosthoge結果、hogeと出力されます。hogeモジュールが自動的に読み込まれwrite-hosthogeコマンドレットが実行されているのです。3.0以降は、モジュールメンバーは明示的なモジュールファイル読み込みをすることなく実行可能です。以降において、モジュールに対して暗黙的な読み込みが実装されました。環境変数$Env:PSModulePathを探索し、正しくモジュールと解釈できるモジュールのファンクションを読み込みます。デフォルトの環境変数は以下の状態です。Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\以下の3つのパスです。Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\;これらのパスに存在するモジュールは、明示的にモジュールを読み込ませずともインテリセンスの候補に上がり、コマンド実行時にImport-Moduleがバックグランドで実行されモジュールが読み込まれます。システムレベルとユーザーレベルのモジュールパスモジュールパスは、システムレベルとユーザーレベルでパスを保持しています。システムレベルとユーザ-レベルでは大きく挙動が変わります。システムレベルパス特に以下が該当します。以下のパスがシステムレベルパスになります。C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules少し見てみるとPowerShellの既定のモジュールはすべてここに含まれていることがわかります。[WindowsErrorReporting][WindowsSearch]これらのモジュールは、ユーザーモジュールパスと異なり、どのユーザーであってもPowerShellエンジンの起動時に自動的にImport-Moduleされています。-ComputerNameやNew-PSSessionなどでWinRM経由で接続したときには、接続時にはこれらのモジュールが読み込まれています。リモートセッションで特定のユーザーごとにモジュールを持たせるのが著しく手間であり、信用できるスクリプトの場合は大きく手間が省けることになります。ユーザーレベルパス以下が該当します。ドキュメントフォルダを移動している場合は、その限りではありません。$env:USERPROFILE\Documents\WindowsPowerShell\Modulesユーザーレベルパスは、現在のユーザーのPowerShellセッションでしか参照されません。さんで接続しているときに、ユーザーfugaさんのユーザーモジュールパスが参照されることはありません。これは、ユーザーごとのモジュール選択可能性を可能にしており、PSリモーティングでも接続に利用したユーザーのユーザーフォルダしか参照されることはありません。モジュールの読み込みが自動的になされます。出力したメンバーを確認することもできるでしょう。2.0を使っている場合は、明示的にモジュールを読み込んでみましょう。あることがわかります。write-hosthogeこれでhogeモジュールが明示的に読み込まれ、write-hosthogeファンクションやモジュールに含まれる変数が読み込まれます。モジュール読み込み時に、読み込まれたモジュール結果出力がいらない場合は、-PassThruスイッチを外します。hogeこのように読み込まれたモジュール結果が出力されません。時に、-Verboseスイッチを付けることでモジュール読み込み時にインポートされたファンクション/変数が確認できます。RunSpaceに読み込まれたモジュールを確認するには以下のようにします。Get-Moduleここでモジュール名を指定することで、そのモジュールが存在するかわかります。Where-Objectコマンドレットを使います。一度モジュールが読み込まれた後に、PowerShellコマンド全体から指定したモジュールメンバーのコマンドレットを取得することもできます。hoge今回の場合は、以下のように出力されます。各セッション情報を保持しています。PowerShellを起動しなおすことで新しいRunSpaceでセッションが実行されます。一方で、一度読み込んだモジュールを現在のRunSpaceを維持したままImport-Moduleしても読み込んだモジュールのまま維持してしまい、新たなモジュール設定を読み込み直すことはありません。この場合、一度読み込んだモジュールを破棄して再度モジュールを読み込み直すか、新しいRunSpaceでモジュールを読み込む必要があります。新たなRunSpaceタブを作ることで、iseを閉じることなく新しいセッションを試すことができます。同一RunSpaceでモジュールの再読み込みを行うには、-Forceスイッチを付けてImport-Moduleします。-Force-Verboseスイッチを付けることで、一度現在のRunSpaceから一度ファンクションが取り除かれてから再度読み込まれていることがわかります。write-hosthogeここまでが、スクリプトモジュールのおおよその概要になります。続いてバイナリモジュールに関して見てみましょう。形式を生成し、PowerShellにモジュールとして読み込ませる方式を指します。強力な機能を利用する際に作成します。デモが中心だったため、資料の一つとして紹介にとどめますが、非常に参考になるセッションでした。モジュール読み込みまでを見てみましょう。コーディング可能です。Studioで開発する流れを順を追ってみてみましょう。クラスライブラリを選択します。Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dllを追加します。System.Management.Automationを追加できます。加えて、以下のサンプルコードを書きます。出力されるだけの意味のないものです。