在Powershell高级函数中使用非标准参数数据类型

时间:2011-02-22 21:08:01

标签: function powershell types parameters

我注意到大多数Powershell高级函数都声明了映射到特定.Net类型的标准数据类型(string,int,bool,xml,array,hashtable等)的参数。

如何使用另一种.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 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:0)

使用标准.NET对象作为函数参数不应该有任何问题 - 您获得的错误与卸载的程序集相关联,这就是我所看到的。检查您的个人资料,确保没有任何异常情况发生 - 请参阅http://msdn.microsoft.com/en-us/library/bb613488%28v=vs.85%29.aspx了解详情。

如果确实如此,您可以使用以下内容加载System.Xml(强制转换为Void以禁止加载的文本输出):

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