Использование нестандартных типов данных параметров в расширенных функциях Powershell - PullRequest
1 голос
/ 23 февраля 2011

Я заметил, что большинство расширенных функций Powershell объявляют параметры стандартных типов данных (string, int, bool, xml, array, hashtable и т. Д.), Которые сопоставляются с конкретными типами .Net.

Как можно объявить параметр расширенной функции, используя другой тип данных .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 ]

2 голосов
/ 23 февраля 2011

Можно использовать пользовательские типы .NET, если вы используете что-то вроде командлета Add-Type для загрузки сборки, определяющей пользовательский тип. Однако в этом случае сборка 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 голосов
/ 23 февраля 2011

У вас не должно быть проблем с использованием стандартных объектов .NET в качестве параметров функции - ошибка, которую вы получаете, связана с выгруженными сборками, и именно здесь я бы посмотрел. Проверьте свой профиль, чтобы убедиться, что ничего необычного не происходит - подробности см. http://msdn.microsoft.com/en-us/library/bb613488%28v=vs.85%29.aspx.

Если это действительно так, вы можете использовать следующее для загрузки System.Xml (приведение к Void для подавления вывода текста загрузки):

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Xml")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...