2009-07-02 11 views
5

Ben oldukça Powershell için yeniyim ve profile.ps1 dosyamı kurmak için çalışıyorum. Ben hızlı işlev çağrıları ile yüklemek istiyorum ki gün boyunca süreçleri korumak için sık sık kullandığım yönetilen birkaç DLL var.Powershell işlevi, örneklenen nesneyi döndürüyor ... türden?

PS > $myLibInstance = LoadSomeDll 

sorunu yüklenecek görünüyor olsa $ myLibInstance, değil yapmasıdır: PowerShell, bunu,

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

Ardından: Yani benim ps1 dosyasında bu işlevi yarattı beklediğim şekilde davranmalıyım ya da açık bir şekilde işlevsiz olarak yüklerseniz. SomeLib.SomeObject öğesinin, nesne oluşturulduğunda kendisini (kayıt defterinden, yuck'ten) yükleyen "ConnectionString" adlı bir public string özelliğine sahip olduğunu varsayalım. Böyle, fonksiyonu olmadan bunu eğer

PS > $myLibInstance.ConnectionString 
//Nothing returned 

Ama:

PS > $myOtherLibInstance.ConnectionString 
StringValueOfConnectionStringProperty 

Bunun nedeni nedir:

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

Ben bu olsun? Bir Powershell işlevinden yeni nesneyi yeni bir nesneyi iade edebilmem mümkün mü?

Şimdiden teşekkürler.

cevap

10

İçinde bulunduğunuz sorun, orijinal işlevinizin tek bir nesne değil, bir dizi nesne döndürmesidir.

PowerShell'deki hilelerden biri, bir işlevde, boş olmayan bir değer değerlendiren her ifadenin, boru hattına yazılacağını anlamasıdır. Bir işlevin "değeri" geri dönüşü, sadece boru hattının içeriğidir.

LoadFrom çağrısı, bir derleme döndürür. Dolayısıyla LoadSomeDll işlevinin gerçek dönüşü, bir montaj ve nesnenizin bir örneğini içeren bir dizidir. Aslında ConnectionString öğesini Object [] türünde çağırıyorsunuz ve bu nedenle sessizce başarısız oluyor.

Fonksiyonu aşağıdaki olarak değiştirmeyi deneyin. Kasıtlı olarak, anahtar kelime geri dönüşümünden ayrıldım çünkü powershell bağlamında kafa karıştırıcı.

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

Tekrar teşekkürler, JaredPar. Geçen hafta benim Powershell kurtarıcın oldun. –

+0

@PITADev, hemen hemen aynı sırayla benim erken powershell günlerde çarptı aynı sorunları :) vurdu. Zaman zaman o kadar tuhaf davranıyor. – JaredPar

+0

+1 güzel bir açıklama. Bu sorunla da karşılaştım. –