Powershell函数返回实例化对象......有点?

时间:2009-07-02 13:56:38

标签: powershell

我对Powershell很新,我正在设置我的profile.ps1文件。我有一些托管的DLL,我经常使用它来维护一整天的进程,我希望能够加载快速函数调用。所以我在ps1文件中创建了这个函数:

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

然后,在Powershell中,我这样做:

PS > $myLibInstance = LoadSomeDll

问题是$ myLibInstance虽然看起来像是被加载了,但它的行为方式与我预期的不同,或者如果我在没有该函数的情况下显式加载它的话。 Say SomeLib.SomeObject有一个公共字符串属性“ConnectionString”,它在构造对象时加载自身(来自注册表,yuck)。

PS > $myLibInstance.ConnectionString
//Nothing returned

但是,如果我没有这个功能就这样做,就像这样:

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

我明白了:

PS > $myOtherLibInstance.ConnectionString
StringValueOfConnectionStringProperty

为什么会这样?有没有办法可以从Powershell函数返回一个实例化的新对象?

提前致谢。

1 个答案:

答案 0 :(得分:10)

您遇到的问题是您的原始函数返回的是对象数组,而不是单个对象。

PowerShell中的一个技巧是理解在函数中,每个不计算非void值的语句都将被写入管道。函数的返回“值”只是管道的内容。

对LoadFrom的调用返回一个程序集。因此,函数LoadSomeDll的实际返回是一个包含程序集和对象实例的数组。你实际上是在Object []类型上调用ConnectionString,因此它会无声地失败。

尝试将功能切换为以下内容。我故意停止关键字返回,因为它在powershell的上下文中令人困惑。

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