2013-08-13 2 views
5

RESTful 웹 서비스 집합에 대한 CLI 프론트 엔드로 상당히 중요한 Posh 모듈을 작성하고 있습니다. 나는 특성화 할 수 있었던 이상한 문제가 있지만 깨끗한 해결책을 찾지 못했습니다.Powershell - 모든 XML 속성이 파이프 라인으로 전달되는 것은 아닙니다

예상 할 속성을 항상 알 수없고 일부 노드는 특정 특성을 가질 수 있지만 다른 노드는 특성을 가질 수 없습니다. 내 문제는 때로는 (읽기 : 자주) 속성이 모든 노드에 존재하지 않는 경우, 그것은 어떤 노드에 대한 파이프 라인 아래로 전달되지 않습니다. XML의 첫 번째 노드에있는 특성과 관련이있는 것으로 보입니다. 그런 다음

[xml]$stuff = Get-Content .\example.xml 

: 나는 그것을 가져 오기 및 XML 주조 변수에 할당

<members> 
    <member> 
     <name>Joe</name> 
     <rank>Grand Poobah</rank> 
     <serialnumber>1234</serialnumber> 
    </member> 
    <member> 
     <name>Fred</name> 
     <serialnumber>1234</serialnumber> 
    </member> 
</members> 

: 아주 간단한 예를 들어

,이 생각은 XML 파일 example.xml의 내용입니다 내가 파이프는 포맷 테이블을하는 (또는 아웃의 gridview, 수출 CSV 등)

$stuff.members.member | ft -AutoSize 

name rank   serialnumber 
---- ----   ------------ 
Joe Grand Poobah 1234 
Fred    1234 

큰 작동합니다. 첫 번째 노드가 순위 속성이없는 경우

지금 : 지금

<members> 
    <member> 
     <name>Fred</name> 
     <serialnumber>1234</serialnumber> 
    </member> 
    <member> 
     <name>Joe</name> 
     <rank>Grand Poobah</rank> 
     <serialnumber>1234</serialnumber> 
    </member> 
</members> 

을 내가 같은 가져 오기를 수행 할 때, 파이프를 그것을 통과은 "순위"속성은 파이프 라인을 아래로 전달되지 않습니다 .

$stuff.members.member | ft -AutoSize 

name serialnumber 
---- ------------ 
Fred 1234 
Joe 1234 

나는 명시 적으로 속성 이름을 지정하여 강제 할 수 있습니다 : 속성은 경고없이 추가 할 수있는 명시 적 속성의 이름을 지정

$stuff.members.member | select-object -Property name, rank, serialnumber | ft 

name rank   serialnumber 
---- ----   ------------ 
Fred    1234 
Joe Grand Poobah 1234 

는 버그위한 조리법이다. 가능한 경우 새로운 속성을 처리 할 수 ​​있도록 코드를 유연하게 유지하려고합니다.

"select-object -property *"를 사용할 수 있다고 생각했는데, 원하지 않는 XML을 삽입 한 powershell을 많이 추가하고 여전히 순위 특성을 파이프하지 않습니다.

$stuff.members.member | select-object -Property *| ft -AutoSize 
name serialnumber LocalName NamespaceURI Prefix NodeType ParentNode OwnerDocument IsEmpty Attributes 
---- ------------ --------- ------------ ------ -------- ---------- ------------- ------- ---------- 
Fred 1234   member       Element members #document  False {} 
Joe 1234   member       Element members #document  False {} 

이 상황을 처리하기위한 좋은 방법에 익숙한 사람이라면 누구입니까? Google 검색에서 좋은 단서를 찾지 못했습니다.

답변

5

XML 요소 은 분명히이며 "파이프가 통과되었습니다." 당신이보고있는 것은 format-table의 특성입니다. 목록의 첫 번째 개체 만보고 인쇄 할 열을 찾습니다.

주로 성능상의 이유로 사용됩니다. 그렇지 않으면 format-table은 목록 을 두 번 번 반복해야합니다. 한 번 출력 할 속성과 실제로 출력 할 두 번째 시간을 알아 내야합니다. 또한 목록에있는 항목이 균일 한 경우가 많습니다. 다른 모든 경우에

규칙은 "명시 적 암시보다 낫다"적용 : 빠른 응답

$stuff.members.member | ft name, rank, serialnumber -AutoSize 
+1

감사합니다. 당신 말이 맞고 설명이 완벽하게 이해되지만 export-csv, out-gridview와 같은 많은 명령에 적용됩니다.방금 포맷 -리스트에 파이핑을 시도했는데, 분명히 표시 할 컬럼을 계산할 필요가 없으며 모든 속성이 보여줍니다. 그래서, 네가 맞아, 그들은 모두 파이프에서 나간다. 감사! – user2678909

관련 문제