2014-10-20 3 views
1

사용자 목록을 반복하여 속성을 가져올 수 있도록 노력하고 있습니다. Powershell을 처음 접했을 때 얻은 결과를 이해하지 못했습니다.Powershell foreach

foreach ($user in $AllUsers) 
{ 
    get-member -inputobject $user; 
    write-host " " 
} 

$AllUsers 객체 속성 및 메소드 세트를 사용자가 6 각을 갖는다. 그러나 위의 코드 블록을 실행하면 출력은 여섯 개의 빈 줄, 각 사용자의 속성 및 메서드 목록이 여섯 번 연속으로 나타납니다. 각 사용자의 속성과 메서드를 빈 줄로 구분하려고합니다. 누군가가 왜 출력을 실행하는지 이해할 수 있습니까? write-host 6 번 그리고 get-member 6 번? 당신도 그 말 때문에 :)

당신은 foreach 문을 사용

, 당신은 모음 ($의 AllUsers)를 각 항목에 대한 코드 블록에 어떤의를하고있는

답변

2

내가 무슨 일이 일어나고 있는지 생각하는 것은 Get-Member의 결과가 파이프 라인에 넣어 블록이 완료 될 때까지 대기지고 있다는 점이다. 반대로 Write-Host의 부작용은 각 루프에서 즉시 발생합니다. 문자열 출력에 쓰면이 문제를 해결할 수 있습니다.

foreach($user in $AllUsers) 
{ 
    $user | gm | out-string 
} 

이렇게하면 공백이있는 각 항목의 구성원이 인쇄됩니다. 대부분 특정 유형의 모든 객체에는 동일한 멤버가 있지만 대개 동적으로 정의 된 멤버가 있습니다.

+0

어떤 이유로 write-host를 사용하여 내용을 추가해야하는 경우 원하는 순서로 인쇄합니다. – Paul

+0

이것은 정확히 알아야 할 내용입니다. 감사. – Karl

1

그것은, 이런 식으로 행동입니다. 따라서 각 사용자에 대해 먼저 get-member가 수행 된 다음 write-host가 빈 행을 작성합니다.

왜 각 사용자의 속성과 메서드를 작성 하시겠습니까? 그들은 동일 할 것이다.

당신은 당신이 할 수있는 모든 속성과 사용자를 나열 할 경우 : 당신은 당신이 표시 할 하나의 결정 때

다음
$AllUsers | format-list * 

당신이 모든 속성을 표시 할 수 있습니다, 당신은 선택할 수 있습니다 만보기 :

$AllUsers | Select-Object Prop1,Prop2,Prop4,Prop10 
+0

각 개체에 다른 멤버가 추가 될 수 있습니다. 쉘의 확장형 시스템. 이러한 멤버는 Add-Member cmdlet을 통해 추가 할 수 있습니다. –

+0

하하 아직 Powershell의 확장 유형 수준이 아닙니다.궁극적으로 저는 한 광고에서 사용자 목록을 가져 와서 다른 광고 목록에 연결하려고합니다. 속성 및 메서드 목록이 각 사용자마다 동일하므로이 특정 명령의 출력은 말할 필요가 없다는 것을 알지만 속성을 추출하기위한 루프를 만들려고 할 때이 문제에 부딪혔습니다. 그리고 그것은 말하자면 반복을 위해 나를 던져 버렸습니다. 그래도 ojk의 Select-Object를 사용할 것입니다. 매우 유용합니다. – Karl

1

Get-Member은 성공 출력 스트림에 쓰지만, Write-Host은 콘솔 (또는 호스트 프로그램)에 씁니다. 다른 출력은 각 명령문이 실행 된 순서대로 표시되지 않을 수도 있습니다. 명령문이 성공 출력 스트림뿐만 아니라 오류 출력 스트림 (또는 경고 또는 디버그와 같은 다른 출력 스트림 중 하나)뿐만 아니라 출력을 쓰는 경우에도이 동작을 얻을 수 있습니다. PowerShell의 출력에 대한 자세한 내용은 here을 참조하십시오. 당신이 개체 구성원의 각 세트 후 인쇄 빈 줄을 원하는 경우

, Write-OutputWrite-Host 교체 :

foreach ($user in $AllUsers) { 
    Get-Member -InputObject $user 
    Write-Output '' 
} 

을 또한 같은 것을 할 수 있습니다 :

foreach ($user in $AllUsers) { 
    (Get-Member -InputObject $user) + '' 
} 

또는 같은

:

$AllUsers | % { (Get-Member -InputObject $_) + '' } 
+0

꽤 감사드립니다. 당신과 마이크 Z는 모두 정확 합니다만, 그 사람이 먼저 왔기 때문에 그에게 올바른 대답을했습니다. – Karl

관련 문제