PSCustomObject到Hashtable

alp*_*dev 64 powershell hashtable pscustomobject

将a转换PSCustomObject为a 的最简单方法是Hashtable什么?它显示就像一个带有splat运算符,花括号和看似是键值对的那个.当我尝试将它投射到[Hashtable]它不起作用.我也试过.toString(),分配的变量说它是一个字符串,但没有显示任何 - 任何想法?

Kei*_*ill 82

不应该太难.像这样的东西应该做的伎俩:

# 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 }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不适用于`ConvertFrom-Json`创建的PSCustomObjects.[这个问题](http://stackoverflow.com/q/22002748/310446)解决了这个问题. (4认同)
  • @BenV:只是为了澄清:问题源于_nested_自定义对象,而不是使用`ConvertFrom-Json`本身,它也产生`[PSCustomObject]`实例.换句话说:生成非嵌套对象的JSON源工作得很好; 例如:`('{"foo":"bar"}'| ConvertFrom-Json).psobject.properties | %{$ ht = @ {}} {$ ht [$ _.Name] = $ _.值} {$ ht}` (3认同)
  • 铸造可能在未来成为现实:https://connect.microsoft.com/PowerShell/feedback/details/679841/allow-casting-of-psobject-or-object-to-hashtable (2认同)

Sha*_*evy 27

基思已经给你答案了,这只是另一种方式,用一个班轮做同样的事情:

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

  • 不错 如果使用%和位置参数作为块,则可以缩短为$ psobject.psobject.properties |。%{$ ht = @ {}} {$ ht [$ _。Name] = $ _。Value} {$ ht}`。@Rubanov:不必位于单个_line_上,但是优点是单个_statement_(管道)可以创建哈希表。 (2认同)

小智 20

这是一个适用于嵌套哈希表/数组的版本(如果您尝试使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一适用于具有多级嵌套对象和数组的数据的版本. (2认同)
  • 针对多级嵌套对象的出色而优雅的解决方案. (2认同)

Svy*_*rny 8

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

$myhashtable = $mypscustomobject | ConvertTo-Json | ConvertFrom-Json -AsHashTable
Run Code Online (Sandbox Code Playgroud)