2010-09-18 71 views
41

PSCustomObject转换为Hashtable的最简单方法是什么?它与splat操作符,花括号以及似乎是关键值对一样显示。当我尝试将它投射到[Hashtable]时,它不起作用。我也尝试.toString()和分配的变量说它的一个字符串,但什么也没有显示 - 任何想法?将PSCustomObject转换为散列表

+0

PSCustomObjects有超过哈希表的优点。在转换之前考虑两次。 http://stackoverflow.com/questions/22002748/hashtables-from-convertfrom-json-have-different-type-from-powershells-built-in-h/22010290#22010290 – spuder 2016-12-09 17:38:51

回答

58

不应该太难。这样的事情应该做的伎俩:

# 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

请注意'$ _。Name'已经一个字符串,所以'$ ht2 [$ _。Name]'或'$ h。($ _。Name)''将和'“$($ _。Name)一样好”'。 – 2011-06-05 14:53:47

+1

你是对的。这对我来说是草率的脚本。 :-) – 2011-06-06 19:52:49

+3

请注意,这对于由'ConvertFrom-Json'创建的PSCustomObjects不起作用。 [这个问题](http://stackoverflow.com/q/22002748/310446)解决了这个问题。 – BenV 2015-01-16 23:22:50

18

基思已经给了你答案,这是做同样的用一行代码的另一种方式:

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

heh,以非常相似的东西开始,除了它足够长以调用SO水平滚动条。顺便说一句,我认为你的'$'s'缺少一些'_'s'。 :-) – 2010-09-18 16:13:53

+0

这就是我试图避免并最终吞噬下划线的标志。谢谢! – 2010-09-19 15:56:46

+0

@ShayLevy:将所有东西放在同一条线上的优点是什么? – Rubanov 2015-05-11 13:30:58

3

这适用于通过创建PSCustomObjects ConvertFrom_Json。

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

声明:我几乎没有理解PowerShell,所以这可能不是那么干净。但它有效(仅适用于一个级别)。

+0

更清洁(可能更难理解)'$ hash = @ {}; $ obj | Get-Member -MemberType属性| foreach {$ hash.Add($ _。Name,$ obj。($ _。Name))}' – Adarsha 2017-05-17 02:38:29

11

这里是与嵌套的哈希表/阵列以及工作(如果你想用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

这是我的数据在多级嵌套对象和数组中使用的唯一版本。 – 2016-02-09 12:55:38

+1

多级嵌套对象的优秀和优雅的解决方案。 – 2016-09-21 00:33:45