2013-02-14 17 views
13

Tôi đã có một bảng băm:Bắt phím băm hiện trong một vòng lặp foreach-Object trong PowerShell

$myHash = @{ 
    "key1" = @{ 
     "Entry 1" = "one" 
     "Entry 2" = "two" 
    } 
    "key 2" = @{ 
     "Entry 1" = "three" 
     "Entry 2" = "four" 
    } 
} 

tôi đang làm một vòng lặp thông qua để có được các đối tượng:

$myHash.keys | ForEach-Object { 
    Write-Host $_["Entry 1"] 
} 

Hoạt động tốt, nhưng tôi có thể sử dụng cái nào để tìm ra chìa khóa của $myHash Tôi đang ở đâu? $_.Name không trả lại bất cứ điều gì. Tôi bối rối. Cứu giúp?

+0

OK, vì vậy ban đầu tôi đã bỏ phần ".keys" của $ myHash.keys trong vòng lặp cả ở đây và trong cửa sổ thử nghiệm của tôi, mặc dù chúng nằm trong tập lệnh thực tế. Khi nó quay ra, chỉ định giá trị .keys không làm cho nó hoạt động. Nhưng mã của Graimer cũng hoạt động, ngay cả với sai lầm ban đầu của tôi, vì vậy anh ta nhận được dấu kiểm. –

Trả lời

33

Tôi thích sử dụng GetEnumerator() khi lặp lại thẻ bắt đầu bằng #. Nó sẽ cung cấp cho bạn một thuộc tính value với đối tượng và thuộc tính key với tên/khóa của nó. Hãy thử:.

$myHash.GetEnumerator() | % { 
    Write-Host "Current hashtable is: $($_.key)" 
    Write-Host "Value of Entry 1 is: $($_.value["Entry 1"])" 
} 
+0

Cảm ơn! Tôi đánh giá cao nó. Hoạt động tốt! –

+1

Một cách phổ biến khác là: $ hash.Keys | % {"khóa là: $ ($ _), giá trị là $ ($ băm [$ _])"} –

+0

Điều này cũng giống nhau, nhưng yêu cầu nhiều lần đọc cho hashtable và dễ bị lỗi chính tả hơn –

5

Bạn cũng có thể làm điều này mà không có một biến

@{ 
    'foo' = 222 
    'bar' = 333 
    'baz' = 444 
    'qux' = 555 
} | % getEnumerator | % { 
    $_.key 
    $_.value 
} 
2

đây một hàm similare tôi sử dụng để đọc tập tin này (giá trị cũng là một cuốn từ điển như của bạn).

tập tin

ini mà tôi biến thành cái nhìn băm như thế này

[Section1] 

key1=value1 
key2=value2 

[Section2] 

key1=value1 
key2=value2 
key3=value3 

Từ ini giao diện Hashtable như thế này (i thông qua fonction rằng làm việc chuyển đổi để băm):

$Inihash = @{ 
      "Section1" = @{ 
       "key1" = "value1" 
       "key2" = " value2" 
      } 
      "Section2" = @{ 
       "key1" = "value1" 
       "key2" = "value2" 
     "key3" = "value3" 
      } 
     } 

do đó từ bảng băm dòng này sẽ tìm kiếm tất cả khóa/giá trị cho một phần nhất định:

$Inihash.GetEnumerator() |?{$_.Key -eq "Section1"} |% {$_.Value.GetEnumerator() | %{write-host $_.Key "=" $_.Value}} 

? = for search where-object equal my section name. % = you have to do 2 enumeration ! one for all the section and a second for get all the key in the section.