2009-07-02 15 views
5

私はPowershellの方が新しく、profile.ps1ファイルの設定に取り組んでいます。私はいくつかのマネージドDLLを持っていますが、私は頻繁にプロセスを維持し、迅速な関数呼び出しでロードできるようにしたいと思っています。インスタンス化されたオブジェクトを返すPowershell関数...種類の?

PS > $myLibInstance = LoadSomeDll 

問題は、それがロードされているように見えるけれども$ myLibInstanceは、しないことです:PowerShellでは、私はこれを行う、

function LoadSomeDll 
{ 
    [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") 
    return new-object "SomeLib.SomeObject" 
} 

その後:だから、私はPS1ファイルにこの関数を作成しました私がそれを期待しているように振る舞うか、あるいは私が関数なしで明示的にそれをロードするかどうかを判断する。 SomeLib.SomeObjectには、オブジェクトが構築されたときに自身を(レジストリからyuckから)読み込むpublic文字列プロパティ "ConnectionString"があるとします。私は機能せずにそれを行う場合

PS > $myLibInstance.ConnectionString 
//Nothing returned 

しかし、このように:

PS > $myOtherLibInstance.ConnectionString 
StringValueOfConnectionStringProperty 

なぜこれが起こるん:?

PS > [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") 
PS > $myOtherLibInstance = new-object "SomeLib.SomeObject" 

私はこれを取得Powershell関数からインスタンス化された新しいオブジェクトを返すことができる方法はありますか?

ありがとうございます。

答えて

10

問題は、元の関数が単一のオブジェクトではなくオブジェクトの配列を返していることです。

PowerShellの秘訣の1つは、関数内で空でない値を評価しないすべてのステートメントがパイプラインに書き込まれることを理解していることです。関数の戻り値は単にパイプラインの内容です。

LoadFromを呼び出すとアセンブリが返されます。したがって、関数LoadSomeDllの実際の戻り値は、オブジェクトのアセンブリとインスタンスを含む配列です。実際には、Object []型のConnectionStringを呼び出しているため、警告メッセージは表示されません。

機能を次のように切り替えてみてください。私は意図的にキーワードリターンを中止しました。なぜなら、PowerShellのコンテキストでは混乱しているからです。

function LoadSomeDll 
{ 
    [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") | out-null 
    new-object "SomeLib.SomeObject" 
} 
+0

ありがとう、JaredPar。先週、あなたはPowershellの救世主でした。 –

+0

@PITADev、あなたは本質的に私が初期のpowershellの時代とほぼ同じ順序で打ったのと同じ問題にぶつかりました。時には直観に反する。 – JaredPar

+0

+1すてきな説明。私もこの問題に遭遇しました。 –

関連する問題