2014-01-07 3 views
4

Powershell에서 해시 테이블의 출력 형식을 지정하여 모든 값을 한 줄로 출력 할 수 있습니까?Powershell에서 해시 테이블의 출력 형식을 한 줄로 출력

$hashErr = @{"server1" = "192.168.17.21"; 
       "server2" = "192.168.17.22"; 
       "server3" = "192.168.17.23"} 

아래로 로그에 기록됩니다 :

$hashErr.GetEnumerator() | Sort-Object Name | ForEach-Object {ForEach-Object {"{0}`t{1}" -f $_.Name,($_.Value -join ", ")} | Add-Content $log 

(가) 아래 기록하는 원인이됩니다

나는 해시 테이블 아래의 값 $ hashErr이 로그에 :

Name       Value 
    ----       ----- 
server2      192.168.17.22 
server1      192.168.17.21 
server3      192.168.17.23 

내 질문은 어떻게 할 수 있습니까? 이 해시 테이블을 포맷하여 출력이 아래처럼 모든 한 줄에 기록됩니까?

server2 192.168.17.22 | server1 192.168.17.21 | server3 192.168.17.23 

는 해시 테이블의 모든 값을 통해 반복하고 배열에 넣어 수행 할 수 있지만, 확실히 더 직접적인 방법은 무엇입니까?

+0

ForEach-Object {'또는 누락 된'}'이있는 것 같습니다. (코드를 변경하면 작동하지만 외부 ForEach-Object는 필요하지 않습니다.) – Duncan

+0

@Duncan 그렇기 때문에 ** Foreach-Object ** 루프가 필요하지 않습니다. '$ hashErr.GetEnumerator() | Sort Name'만으로는 자신의 목록에 출력물을 생성합니다. 실제로 ** Foreach-Object ** 루프/형식 문자열을 사용하면 열 제목을 쓰지 않습니다. user_invalid, 그 표제는 어디에서 나온 것입니까? 미리 수동으로 로그에 추가 했습니까? –

+0

제목이 수동으로 추가되지 않았습니다. 항목이 추가 된 순서대로 해시 테이블의 표준 출력으로 보입니다. 'PS M : \> $ hashErr ' –

답변

8

해시 테이블의 키를 반복 할 수 있고 루프에서 값을 조회 할 수 있습니다. 당신이 보여하지만 코드에 둘, 하나의 서버에 여러 개의 IP 주소에 대한

($hashErr.Keys | foreach { "$_ $($hashErr[$_])" }) -join "|" 
1

당신이 정렬을 유지 하시겠습니까 및 지원 : 파이프 라인을 사용하여 당신은 중간 수집이 필요하지 않습니다 출력물에?

난 당신이 얻을 것이다 가장 좋은 원본에 단지 약간의 변형이라고 생각 그렇다면 :

C:\scripts> ($hashErr.GetEnumerator() | sort Name | % { "$($_.Name) $($_.Value -join ',')" }) -join "|" 
server1 192.168.17.21|server2 192.168.17.22|server3 192.168.17.23,1.2.3.4 
+0

순서는 중요하지 않지만 키당 여러 값을 가질 가능성이 있습니다. 어쨌든 이것은 완벽하게 작동하고 정확하게 내가 찾고 있던 것이 었습니다. 도와 주셔서 감사합니다. –

3

리처드의 솔루션의 V4 버전 :

$hashErr = @{"server1" = "192.168.17.21"; 
       "server2" = "192.168.17.22"; 
       "server3" = "192.168.17.23"} 

$hashErr.Keys.ForEach({"$_ $($hashErr.$_)"}) -join ' | ' 

server3 192.168.17.23 | server2 192.168.17.22 | server1 192.168.17.21 
1

조금 늦게 파티에 , mjolinor의 솔루션 @에 확대, 당신은 [주문] 유형 가속기를 사용할 수 있습니다

$hashErr = [ordered]@{"server1" = "192.168.17.21"; 
      "server2" = "192.168.17.22"; 
      "server3" = "192.168.17.23"} 

$hashErr.Keys.ForEach({"$_ $($hashErr.$_)"}) -join ' | ' 

server1 192.168.17.21 | server2 192.168.17.22 | server3 192.168.17.23 

내가 생각하는 [나 dered]는 PS 3.0에서 소개되었습니다.