10

グローバル環境にロードする必要がある他のいくつかのモジュールに依存するモジュールを作成しています。スクリプトを作成し、ScriptsToProcess を使用してモジュールをインポートしようとしましたが、ScriptstoProcess が実行される前に RequiredModules のチェックが行われるようです。

モジュールマニフェストで、モジュールを要求し、まだロードされていない場合は自動的にロードするためのきれいな方法はありますか? モジュールをロードできなかった場合、RequiredModule はエラーをスローします。

4

2 に答える 2

10

PowerShell V3 の動作は多少異なります。そのキーを指定してマニフェストをロードすると、必要なモジュールがロードされるようになりました。また、モジュールを削除しても、そのモジュールがどのようにロードされたかに関係なく、必要なモジュールはアンロードされません。興味深いことに、-Force は必要なモジュールの自動ロードを表示していないようです。


編集: モジュールがデフォルトの場所のいずれにもない場合は、そのモジュール (またはモジュールが存在する親フォルダー) へのパスを$env:PSModulePath変数に追加する必要があります。


補足: PSv3 以降、スクリプト#Requires内のコマンドがサポートされています。これを使用して、(1) スクリプトでモジュールの依存関係を読み込もうとし、(2) モジュールが読み込まれない/できない場合に終了することができます。

#Requires -Modules ModuleName1,ModuleName2

これには、スクリプトを実行する$env:PSModulePathに設定する必要があるの下にモジュールを配置する必要もあります。

于 2012-05-10T15:45:38.073 に答える
10

PowerShell 3 以降では、RequiredModules自動的に読み込まれます

また、モジュールを配布する場合、PowerShellGet (つまりPowerShell ギャラリー) を使用しているユーザーが依存関係をインストールすることを確認する唯一の方法でもあります。

必要なモジュールが欠落している場合は失敗しますが、それ以外の場合は、希望どおりに機能します。

PowerShell 2 では、RequiredModules を自動的に読み込む方法はありません

どちらの場合でも、ユーザーは入力して手動で要件を​​読み込むことができますImport-Module RequiredModule, YourModule-- 既にインポートされている場合、2 番目のインスタンスは取得されません ...

代わりに NestedModules でモジュールを指定することもできます。PowerShell 2 でも、それらはモジュールの "内部" に読み込まれますが、既に読み込まれている場合、リソースに悪影響を与えるようには見えません。ただし、@JasonMArcherが思い出したように、PowerShell 2では、モジュールが(Remove-Moduleを介して)アンロードされると、NestedModulesがモジュールとともにアンロードされます。これは、ユーザーが個別にプリロードした場合でも発生し、最終的にはユーザーはそれを期待していないため、非常に奇妙なバグレポートが生成されます。

PowerShell のすべてのバージョンで機能する他のオプションは、モジュールのインポートが失敗するようにImport-Module、モジュールの先頭で (モジュールがまだロードされていないことを確認した後、psm1 スクリプトで)セットを呼び出すことです。-ErrorAction Stop依存モジュールのインポートが失敗した場合。

if (!(Get-Module Dependency)) { ## Or check for the cmdlets you need
    ## Load it nested, and we'll automatically remove it during clean up
    Import-Module Dependency -ErrorAction Stop
}

実際、バージョンを確認したい場合は...

if (!(Get-Module Dependency | Where { $_.Version -ge "2.5" )) { 
    ## Load version 2.5 (or newer), or die 
    Import-Module Dependency -Version 2.5 -ErrorAction Stop
}

これはドキュメントとして機能しないことを覚えておいてください。したがって、モジュールを配布すると、ユーザーは依存関係について知りません。

于 2011-03-30T18:08:36.273 に答える