2010-09-18 29 views
41

Cách dễ nhất để chuyển đổi một số PSCustomObject thành Hashtable là gì? Nó hiển thị giống như một với toán tử splat, dấu ngoặc nhọn và những gì xuất hiện là cặp giá trị khóa. Khi tôi cố gắng truyền nó đến [Hashtable] nó không hoạt động. Tôi cũng đã thử .toString() và biến được gán cho biết chuỗi của nó nhưng không hiển thị gì - bất kỳ ý tưởng nào?PSCustomObject để Hashtable

+0

PSCustomObjects có lợi thế hơn hashtables. Suy nghĩ kỹ trước khi chuyển đổi nó. http://stackoverflow.com/questions/22002748/hashtables-from-convertfrom-json-have-different-type-from-powershells-built-in-h/22010290#22010290 – spuder

Trả lời

58

Không nên quá khó. Một cái gì đó như thế này nên làm như lừa:

# Create a PSCustomObject (ironically using a hashtable) 
$ht1 = @{ A = 'a'; B = 'b'; DateTime = Get-Date } 
$theObject = new-object psobject -Property $ht1 

# Convert the PSCustomObject back to a hashtable 
$ht2 = @{} 
$theObject.psobject.properties | Foreach { $ht2[$_.Name] = $_.Value } 
+0

Lưu ý rằng '$ _. Name' đã một chuỗi, vì vậy '$ ht2 [$ _. Name]' hoặc '$ h. ($ _. Name)' sẽ hoạt động giống như '" $ ($ _. Name) "'. –

+1

Bạn nói đúng. Đó là kịch bản cẩu thả về phía tôi. :-) –

+3

Lưu ý rằng điều này không làm việc cho PSCustomObjects được tạo bởi 'ConvertFrom-Json'. [Câu hỏi này] (http://stackoverflow.com/q/22002748/310446) giải quyết vấn đề đó. – BenV

18

Keith đã đưa cho bạn câu trả lời, đây chỉ là một cách khác để làm việc cùng với một lớp lót:

$psobject.psobject.properties | foreach -begin {[email protected]{}} -process {$h."$($_.Name)" = $_.Value} -end {$h} 
+0

Heh, bắt đầu với một cái gì đó rất giống nhau, ngoại trừ việc nó đủ dài để gọi thanh cuộn SO ngang. BTW Tôi nghĩ rằng '$ 's' đang thiếu một số' _'s'. :-) –

+0

Đó là những gì tôi đã cố gắng để tránh và cuối cùng nó nuốt dấu gạch dưới. Cảm ơn! –

+0

@ShayLevy: Lợi thế của việc đặt mọi thứ trên cùng một dòng là gì? – Rubanov

3

này làm việc cho PSCustomObjects tạo ra bởi ConvertFrom_Json.

Function ConvertConvertFrom-JsonPSCustomObjectToHash($obj) 
{ 
    $hash = @{} 
    $obj | Get-Member -MemberType Properties | SELECT -exp "Name" | % { 
       $hash[$_] = ($obj | SELECT -exp $_) 
     } 
     $hash 
} 

Tuyên bố từ chối trách nhiệm: Tôi hầu như không hiểu PowerShell vì vậy điều này có thể không sạch như nó có thể. Nhưng nó hoạt động (chỉ cho một cấp).

+0

Ít sạch hơn (có thể khó hiểu hơn) '$ hash = @ {}; $ obj | Get-Member -MemberType Properties | foreach {$ hash.Add ($ _. Tên, $ obj. ($ _. Name))} ' – Adarsha

11

Dưới đây là một phiên bản làm việc với hashtables lồng/mảng cũng như (đó là hữu ích nếu bạn đang cố gắng để làm điều này với DSC ConfigurationData):

function ConvertPSObjectToHashtable 
{ 
    param (
     [Parameter(ValueFromPipeline)] 
     $InputObject 
    ) 

    process 
    { 
     if ($null -eq $InputObject) { return $null } 

     if ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) 
     { 
      $collection = @(
       foreach ($object in $InputObject) { ConvertPSObjectToHashtable $object } 
      ) 

      Write-Output -NoEnumerate $collection 
     } 
     elseif ($InputObject -is [psobject]) 
     { 
      $hash = @{} 

      foreach ($property in $InputObject.PSObject.Properties) 
      { 
       $hash[$property.Name] = ConvertPSObjectToHashtable $property.Value 
      } 

      $hash 
     } 
     else 
     { 
      $InputObject 
     } 
    } 
} 
+2

Đây là phiên bản duy nhất làm việc cho dữ liệu của tôi với các đối tượng và mảng lồng nhau đa cấp. –

+1

Giải pháp tuyệt vời và thanh lịch cho các đối tượng lồng nhau đa cấp. –