# array
C:\> (1,2,3).count
3
C:\> (1,2,3 | measure).count
3
# hashtable
C:\> @{1=1; 2=2; 3=3}.count
3
C:\> (@{1=1; 2=2; 3=3} | measure).count
1
# array returned from function
C:\> function UnrollMe { $args }
C:\> (UnrollMe a,b,c).count
3
C:\> (UnrollMe a,b,c | measure).count
1
C:\> (1,2,3).gettype() -eq (UnrollMe a,b,c).gettype()
True
HashTables와의 불일치는 fairly well known이지만 official documentation은 (예를 통해) 비스듬히 언급합니다.Powershell 파이프 라인이 컬렉션을 언 롤할지 여부를 결정하는 요소는 무엇입니까?
기능에 대한 문제는 내게 뉴스입니다. 나는 지금까지 나를 물지 않았다는 것에 충격을 받았다. 스크립터가 따라야 할 지침 원칙이 있습니까? C#에서 cmdlet을 작성할 때 열거 형을 명시 적으로 제어 할 수있는 overload of WriteObject이 있지만 Posh 언어 자체에는 AFAIK와 같은 구문이 없다는 것을 알고 있습니다. 마지막 예에서 알 수 있듯이 Posh 해석기는 파이프 된 객체의 유형에 차이가 없다고 생각하는 것 같습니다. 약간의 Object 대 PSObject의 이상한 점이 있을지도 모르겠다.하지만 순수 Posh을 쓰고 스크립트 언어가 "작동하도록"기대할 때 거의 사용되지 않는다.
/편집/
키스는 내 예에서, 내가 3 개 문자열 인수보다는 하나의 문자열 [] 인수를 전달하고있어 지적하고 올바른 것입니다. 즉, Measure-Object가 Count = 1이라고 말하는 이유는 첫 번째 요소가 @ ("a", "b", "c") 인 단일 배열 배열을보고 있기 때문입니다. 공정하다. ...
# stick to single objects
C:\> (UnrollMe a b c | measure).count
3
# rewrite the function to handle nesting
C:\> function UnrollMe2 { $args[0] }
C:\> (UnrollMe2 a,b,c | measure).count
3
# ditto
C:\> function UnrollMe3 { $args | %{ $_ } }
C:\> (UnrollMe3 a,b,c | measure).count
3
그러나,이 모든 것을 설명하지 않습니다 내가 연극에서 다른 규칙이있다 추정 할 수 있는지부터
# as seen earlier - if we're truly returning @(@("a","b","c")) why not count=1?
C:\> (UnrollMe a,b,c).count
3
# our theory must also explain these results:
C:\> ((UnrollMe a,b,c) | measure).count
3
C:\> (@(@("a","b","c")) | measure).count
3
C:\> ((UnrollMe a,b,c d) | measure).count
2
:이 지식은 여러 가지 방법으로 문제를 해결 할 수 있습니다 경우 당신은 정확하게 하나의 요소를 가진 배열을 가지고 있고 파서는 expression mode에 있고, 인터프리터는 그 요소를 "unwrap"할 것이다. 더 이상 미묘한 차이가 있습니까?
WriteObject와 동일한 기능은 값이 암시 적으로 stdout 스트림으로 출력되기 때문에 거의 사용하지 않는 Write-Output cmdlet입니다. –
사실 Write-Output에는 WriteObject (object, bool)처럼 -EnumerateCollection 매개 변수가 없습니다. –
관련 : http://stackoverflow.com/questions/28702588/in-what-conditions-does-powershell-unroll-items-in-the-pipeline/28707054#28707054 – alx9r