質問: 2 # こちらの$XをBとする $formContainer.mouseMonitor.Start() $formContainer.Form.ShowDialog() > $null $formContainer.Form.Dispose() $formContainer.mouseMonitor.Dispose() # Formとの紐付けが無いため、忘れないように ``` ### 補足情報(FW/ツールのバージョンなど) Win10
回答: まずはじめに。トリッキーなコードを書いてしまい、混乱させてしまったようですみません。 `New-Module -AsCustomObject ~`の使い方は一般的な使い方では無いため、基本のモジュールの話から簡単に書いておきます。 > > about_Modules | Microsoft Docs > > about_Modules 非公式?日本語版 > > > PowerShell のモジュール詳解とモジュールへのコマンドレット配置手法を考える - tech.guitarrapc.cóm > > > VBAを触っていらっしゃっているのでVBAの概念で例えると、標準モジュールがイメージにもっとも近いです。 任意の変数・関数を格納でき、必要に応じてそれらを外部に公開できるものです。 PowerShellのモジュールの場合、動的なロード・アンロード、引数を渡しての初期化なども行えますが、通常使う分には上記のようなイメージです。 中の変数・関数のうち、「何を公開するか」の指定に使用するのが、質問の一つである`Export-ModuleMember`です。 PowerShellのモジュールは、通常は`$env:PSModulePath`以下にフォルダとして配置します。 フォルダ名がモジュール名となり、フォルダの中に「モジュール名.psm1」や「モジュール名.psd1」といったファイルを配置することでモジュールとして読み込めるようになります。 質問のもう一つである`New-Module`は、ファイルとしてのスクリプトの代わりにスクリプトブロックを読み込んで、動的にモジュールを生成するものです。 普通に読み込んだモジュールは`Export-ModuleMember`で指定された変数・関数を公開するだけです。 しかし`-AsCustomObject`スイッチを設定することで、指定された変数・関数をメンバーとして持つ`PSCustomObject`を生成します。 これもVBAに例えると、標準モジュールのコードをクラスモジュールに書いてインスタンスできるようにした、というイメージです。 前回の質問では、 変数のスコープがややわかりにくい、などの理由から、スコープを切り分けたい・カプセル化したいと考えました。 その方法として、クラスなどいくつか候補がありましたが、処理がスクリプトブロックの形でまとまっていたため、比較的変更量が少ない`New-Module -AsCustomObject`を使用した、ということになります。 `New-Module`自体はモジュールを生成するためのものであるため、そのあたりでどうしてもトリッキーな書き方となってしまいました。