我注意到大多数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()完成吗?怎么样?
假设这是可能的,这里有一个辅助问题:这种方式使用非标准类型会违反“最佳实践”吗?
答案 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")