web-dev-qa-db-ja.com

PowerShellインポートモジュールとドットソース

一部の機能をメインのPowerShellスクリプトから分離したい場合は、.ps1ファイルとして記述し、同じようにドットソースするか、.psm1として作成して同じものをインポートすることができます。 Import-Moduleを使用します。

どっちがいいの?なぜ?

30
RinoTom

モジュールはライブラリに最適です。モジュールから何をエクスポートするかをより詳細に制御できます。つまり、デフォルトでは、PSM1ファイル内のすべてのスクリプト変数はプライベートです。インポートされたときに、モジュールの外部からは見えません。同様に、すべての関数はパブリックです。ただし、PSM1ファイルでExport-ModuleMemberを使用して、モジュールからエクスポートする変数、関数、エイリアス、コマンドレットなどを正確に制御できます。モジュールをセッションから削除することもできます。これは、.PS1スクリプトのドットソーシングとの大きな違いです。もう1つの違いは、モジュール関数の名前空間がモジュール内にあるため、モジュール名と「\」を関数名の前に付けることで、同じ名前のモジュールベースの関数に簡単にアクセスできることです。 PSCX\Get-Uptime。 ISEでは、このプレフィックスはインテリセンスサポートも呼び出します。

通常、モジュールを使用することをお勧めします。 :-)

28
Keith Hill

Dotsourcing +スクリプトとモジュールは2つの異なるものです。モジュールは、スクリプトで使用する関数やコマンドレットを収集/グループ化するのに最適です。インタラクティブに使用したい関数がある場合(コンソールで関数を呼び出す)、モジュールは最適です。

実行する大きなスクリプトが1つある場合は、「ファイル共有を移行する」とするか、タスクスケジューラを使用して定期的に呼び出す単一のスクリプトを作成すると、ドットソーシングが簡単になります。

それはあなたが必要とするものに依存します。概要:

  • この状況で関数/スクリプトを使用するだけの場合(スクリプト/ジョブ)=ドットソースを使用します。
  • 他のスクリプトでも使用されている一般的な関数/スクリプトを使用する場合ORインタラクティブに関数の一部を呼び出したい場合など。=モジュールを使用します。
15
Frode F.

他の回答に加えていくつかのモジュール機能。

  • PowerShell V3では、モジュールのエクスポートされたコマンドを使用するためにImport-Moduleを呼び出す必要はありません。これは、コマンドがインタラクティブに使用される場合に特に役立ちます。 PowerShellは、使用可能なすべてのモジュールコマンドとそのヘルプGet-Help SomeCommandをキャッシュして知っています(ただし、モジュールヘルプGet-Help about_SomeModuleには当てはまりません)。

  • ドットソース関数とスクリプトモジュール関数の動作には、いくつかの微妙な違いがあります。 Powershell scriptblock変数のスコープとモジュールでの奇妙な動作、何か提案はありますか? スクリプトモジュールを使用すると、特に、不要な違いや問題を発見するのが遅すぎます。つまり、単純なものは開発の最初はうまく機能しますが、複雑なものは後でうまくいかなくなります。

全体として、モジュールがうまく機能しない場合を除き、通常はモジュールを使用します。それらの1つは、スクリプトモジュール関数で渡されたユーザースクリプトブロックを呼び出すことです。

5
Roman Kuzmin