2011-02-22 4 views
1

Powershell 고급 함수는 대부분의 특정 .Net에 매핑되는 표준 데이터 형식 (문자열, int, bool, xml, 배열, 해시 테이블 등)의 매개 변수를 선언합니다. 유형.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을 놓친, 키스의 완벽 . –

관련 문제