PSCustomObject到Hashtable

时间:2010-09-18 02:22:51

标签: powershell hashtable pscustomobject

PSCustomObject转换为Hashtable的最简单方法是什么?它显示就像一个带有splat运算符,花括号和看似是键值对的那个。当我尝试将其强制转换为[Hashtable]时,它无效。我也试过.toString(),分配的变量说明了一个字符串,但没有显示任何想法?

6 个答案:

答案 0 :(得分:75)

不应该太难。这样的事情可以解决问题:

# 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 }

答案 1 :(得分:25)

基思已经给你答案了,这只是另一种用单线做同样的方式:

$psobject.psobject.properties | foreach -begin {$h=@{}} -process {$h."$($_.Name)" = $_.Value} -end {$h}

答案 2 :(得分:18)

这是一个适用于嵌套哈希表/数组的版本(如果您尝试使用DSC ConfigurationData执行此操作,这很有用):

UPDATE table b table a SET rid = 110 WHERE rid =1

答案 3 :(得分:4)

我极其懒惰的方法,由PowerShell 6中的一项新功能启用:

$myhashtable = $mypscustomobject | ConvertTo-Json | ConvertFrom-Json -AsHashTable

答案 4 :(得分:3)

这适用于ConvertFrom_Json创建的PSCustomObject。

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

免责声明:我几乎不了解PowerShell,所以这可能不是那么干净。但它有效(仅限一个级别)。

答案 5 :(得分:0)

我的代码:

function PSCustomObjectConvertToHashtable() {
    param(
        [Parameter(ValueFromPipeline)]
        $object
    )

    if ( $object -eq $null ) { return $null }

    if ( $object -is [psobject] ) {
        $result = @{}
        $items = $object | Get-Member -MemberType NoteProperty
        foreach( $item in $items ) {
            $key = $item.Name
            $value = PSCustomObjectConvertToHashtable -object $object.$key
            $result.Add($key, $value)
        }
        return $result
    } elseif ($object -is [array]) {
        $result = [object[]]::new($object.Count)
        for ($i = 0; $i -lt $object.Count; $i++) {
            $result[$i] = (PSCustomObjectConvertToHashtable -object $object[$i])
        }
        return ,$result
    } else {
        return $object
    }
}