2011-02-22 52 views
1

我注意到大多數Powershell高級函數都聲明瞭映射到特定.Net的標準數據類型(string,int,bool,xml,array,hashtable等)的參數類型。在Powershell高級功能中使用非標準參數數據類型

如何使用另一個.Net數據類型聲明高級函數參數?例如,這裏是一個人爲的例子:

function Do-Something 
{ 
    [CmdletBinding()] 
    Param(  
     [System.Xml.XPathNodeList] $nodeList 
    ) 

    Begin {} 
    Process 
    {  
     Foreach ($node in $nodeList) 
     { 
      Write-Host $node 
     }   
    } 
    End {} 
}   

# Prepare to call the function: 
$xml = [xml](get-content .\employee.xml) 
$nodeList = $xml.SelectNodes("//age") 

# Call the function passing an XPathNodeList: 
do-something $nodeList 

調用此函數導致以下運行時錯誤:()

Unable to find type [System.Xml.XPathNodeList]: make sure that the assembly 
containing this type is loaded. 

可以這樣用LoadWithPartialName實現的呢?怎麼樣?

假設這是可能的,這裏有一個輔助問題:這種方式使用非標準類型會違背「最佳實踐」嗎?

回答

2

只要您使用類似於cmdlet Add-Type的東西來加載定義自定義類型的程序集,就可以使用自定義.NET類型。但是在這種情況下,程序集System.Xml已被加載。您的問題出現是因爲您指定的類型是私有類型,即只在System.Xml程序集中可見。

PS> $nodeList.GetType() 

IsPublic IsSerial Name      BaseType 
-------- -------- ----      -------- 
False False XPathNodeList   System.Xml.XmlNodeList 

使用公共基類來代替:

[CmdletBinding()] 
Param(
    [Parameter()]   
    [System.Xml.XmlNodeList] 
    $nodeList 
) 
0

你不應該使用標準的.NET對象作爲函數參數的任何問題 - 你得到的錯誤與卸載組件有關,這就是我看的地方。檢查您的個人資料以確保沒有異常情況發生 - 詳情請參閱http://msdn.microsoft.com/en-us/library/bb613488%28v=vs.85%29.aspx

如果真的涉及到它,你可以使用以下加載的System.Xml(鑄造空隙抑制裝載的文本輸出):

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Xml") 
+0

哎呦 - 錯過了上面列出CmdletBinding,Keith的是完美的。 – 2011-02-22 21:32:19