2016-12-21 7 views
0

私はPowerShellのドキュメントを手に入れようとしており、混乱の中でヒットしました。モジュールマニフェストを使用したPowerShell Cmdletアセンブリのロード

hereというサンプルコードを使用して、コマンドレットアセンブリを作成しています。

私は、コマンドを発行してモジュールをロードすることができます。

Import-Module -Name *NameOfAssembly* 

アセンブリはPowerShellはそれを見つけることができますフォルダにある場合、これは、もちろん、です。

モジュールマニフェストを作成した場合、モジュールマニフェストを取得してアセンブリをロードできる唯一の方法は、アセンブリをマニフェストのRequiredModules行に追加することです。ドキュメント(hereにある)は、実際にモジュールをロードしていないことを示しています。私が観察したことから、これは実際に起こることと矛盾しています。私はこれを間違って読むか理解していますか?そうでなければ、私は何が欠けていますか?コマンドレットアセンブリ(またはアセンブリ)を入手するためのよりよい方法がありますか(私はバイナリモジュールと呼ばれています)をデプロイしましたか?

+0

'Import-Module'の前にこれを設定してください:' $ PSModuleAutoloadingPreference = 'None''。 BTWは 'RootModule'または' NestedModules'マニフェストキーを使うために必要なモジュールを読み込みます。 – PetSerAl

答えて

1

まず、スクリプトモジュールと同じように、

:単にあなたが本当にPowerShellのバージョンに応じて、2つの選択肢を持っているマニフェスト(いくつかのメタデータ用など、または外部ファイル)を必要とする場合には $env:PSModulePath

$dir = mkdir $profile\..\Modules\Greetings -Force 
$dllPath = Join-Path -Path $dir.FullName -ChildPath Greetings.dll 
Add-Type @' 
using System.Management.Automation; 
namespace SendGreeting 
{ 
    [Cmdlet(VerbsCommunications.Send, "Greeting")] 
    public class SendGreetingCommand : Cmdlet 
    { 
    [Parameter(Mandatory=true)] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    private string name; 
    protected override void ProcessRecord() 
    { 
     WriteObject("Hello " + name + "!"); 
    } 
    } 
} 
'@ -OutputAssembly $dllPath 
Import-Module Greetings -PassThru 

に記載されている任意のフォルダのNameOfModuleサブフォルダにそれを置くことによってNameOfModule.dllのロード

  • V2 - ModulesToProcess(新しいバージョンで動作しますが、警告の原因となる)
  • V3 + - RootModule(v2で失敗)

あなたが使用したキー、RequiredModulesは、名前への道を提供することがありますあなたの依存関係。例えば。あなたのコードが依存するモジュール。 RequiredAssemblies PowerShellコマンドレットを含むアセンブリを追加するだけで動作しますが、コマンドを定義した将来のユーザーからのアプローチは「隠れる」ためです。

+0

ありがとうございます。私が最初にあなたの応答を読んだとき、私は(または私が考えた)前に 'RootModule'パラメータを設定しようとしたときに、それがうまくいくとは思っていませんでした。私が忘れていたことは、マニフェストに変更を加えた後、 'Import-Module'を実行する前に' Remove-Module'コマンドを実行することでした。あなたがあなたの回答に含めたスクリプトを使って私が発見したもう一つのことは、 'CmdletsToExport'パラメータの値も同様に設定する必要があったことです。私が今思うようにすべてが働いています。 –

+0

ところで:モジュールが再インポートされたことを保証したいならば、 '-Force'パラメータで' Import-Module'を実行することができます - 既にロードされている場合、モジュールはバックグラウンドで削除されます。 – BartekB

-1

AFAIK RequiredModulesはモジュールをロードしてはならず、モジュールがすでにロードされているかどうかチェックするだけです。しかし、バイナリアセンブリを追加する場合は、実際にRequiredAssemblies行を使用したい場合は、現在のセッションにバイナリを読み込みます(紛らわしいことに)

関連する問題