web-dev-qa-db-fra.com

PSCustomObject à Hashtable

Quelle est la façon la plus simple de convertir un PSCustomObject en Hashtable? Il s'affiche comme un avec l'opérateur splat, les accolades et ce qui semble être des paires de valeurs clés. Lorsque j'essaie de le convertir en [Hashtable] Cela ne fonctionne pas. J'ai également essayé .toString() et la variable assignée dit que c'est une chaîne mais n'affiche rien - des idées?

62
alphadev

Ça ne devrait pas être trop dur. Quelque chose comme ça devrait faire l'affaire:

# 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 }
79
Keith Hill

Keith vous a déjà donné la réponse, c'est juste une autre façon de faire la même chose avec un one-liner:

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

Voici une version qui fonctionne également avec des tables de hachage/tableaux imbriqués (ce qui est utile si vous essayez de le faire avec 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
        }
    }
}
18
Dave Wyatt

Cela fonctionne pour les PSCustomObjects créés par ConvertFrom_Json.

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

Avertissement: je comprends à peine PowerShell, donc ce n'est probablement pas aussi propre qu'il pourrait l'être. Mais cela fonctionne (pour un seul niveau).

3
mhenry1384

Mon code:

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
    }
}
0
Hu Xinlong