2013-02-14 21 views
22

メインPowerShellスクリプトから一部の機能を切り離したい場合は、.ps1ファイルとドッ​​トソースを同じに書くか、.psm1としてインポートしてインポートすることができます。 Import-Moduleを使用して同じです。PowerShellインポートモジュールとドットソーシング

どちらが優れているのですか?

+0

私はすべての答えが有益で有用であると感じます。私はこの質問の答えとして特定のものをマークすることはできません。だから、私はちょうど彼らのそれぞれのためにupvoteを与えています。それが理にかなってほしい。あなたの提案をありがとう。 – RinoTom

+2

あなたはあなたが1つを持っていると思ったら答えを選んだ方が良いでしょう。 (btw、私のものではなく、ちょうど備考を追加する)。 –

答えて

13

Dotsourcing +スクリプトとモジュールは2つの異なるものです。モジュールは、スクリプトで使用する関数とコマンドレットを収集/グループ化するのに最適です。対話的に使用する機能(コンソールで関数を呼び出す)がある場合、モジュールは非常に適しています。

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

これは必要なものによって異なります。要約:

  • この状況(スクリプト/ジョブ)で関数/スクリプトを使用するだけで、ドット・ソースを使用してください。
  • 他のスクリプトでも使用されている共通関数/スクリプトを使用している場合や、対話的に関数の一部を呼び出すなどの場合は、moduleを使用します。
24

モジュールはライブラリに最適です。モジュールからエクスポートされる内容をより詳細に制御できます。つまり、デフォルトでは、PSM1ファイル内のすべてのスクリプト変数は非公開です。モジュールをインポートするときに、モジュールの外側には表示されません。同様に、すべての機能は公開されています。ただし、PSM1ファイルのExport-ModuleMemberを使用して、モジュールからエクスポートする変数、関数、エイリアス、コマンドレットなどを正確に制御することができます。セッションからモジュールを削除することもできますが、これは.PS1スクリプトのドット区切りと大きな違いがあります。もう1つの違いは、モジュール関数はモジュールが名前空間を持ち、同じ名前のモジュールベースの関数に簡単にアクセスできるため、モジュール名と関数名に "\"を接頭辞として付けることです。 PSCX \ Get-Uptime。 ISEでは、この接頭辞もintellisenseサポートを呼び出します。

一般的にモジュールを使用することをおすすめします。 :-)

+0

モジュール内から.PS1'スクリプトを読み込む( 'dotsourcing')あなたの考えは?これは[Pester's](https://github.com/pester/Pester/blob/master/Pester.psm1)アプローチです。 – craig

+1

それはいいと思います。ドットソーススクリプトはそのモジュールにスコープされます。 –

5

他の回答に加えて、いくつかのモジュール機能があります。 PowerShellのV3の一

  • モジュールのエクスポートコマンドを使用するためにImport-Moduleを呼び出す必要はありません。対話的にコマンドを使用する場合に特に便利です。 PowerShellは、利用可能なすべてのモジュールコマンドとそれらのヘルプでさえもキャッシュして知っていますGet-Help SomeCommand(しかし、これはモジュールヘルプGet-Help about_SomeModuleでは当てはまりません)。

  • dot-sourced関数とスクリプトモジュール関数の動作には、いくつかの微妙な違いがあります。 Strange behavior with Powershell scriptblock variable scope and modules, any suggestions? 時には、スクリプトモジュールを使用すると苦痛を感じることがあります。特に、望ましくない差異や問題が発見されたとき、つまり開発の初期段階では単純なものがうまく動作しますが、複雑なものが始まる場合があります。後で間違って行く。

概して、正常に動作しない場合を除いて、通常はモジュールを使用します。そのうちの1つは、スクリプトモジュール関数で渡されたユーザースクリプトブロックを呼び出すことです。

+0

Powershellは、作成したテキストファイルについて、どうすればそれを知り、someModule.psm1という名前を付けることができますか? Powershellは永久に私のファイルシステムをスキャンしますか? –

+0

場合によっては、PowerShellは標準モジュールの場所をスキャンし、新しいモジュールと変更されたモジュールを読み取り、キャッシュします。私が知る限り、詳細は文書化されていません。 –

+1

私が知る限り、Powershellは '$ Env:PSModulePath'で指定されたフォルダ内のファイルのみをチェックします。 ([ここ](https://msdn.microsoft.com/en-us/library/dd878350(v = vs.85).aspxを参照)) –

関連する問題