PSCustomObject a Hashtable

¿Cuál es la forma más fácil de convertir un PSCustomObject en una Hashtable ? Se muestra como uno con el operador de splat, llaves y lo que parecen ser pares de valores clave. Cuando bash [Hashtable] a [Hashtable] , no funciona. También probé .toString() y la variable asignada dice que es una cadena pero no muestra nada, ¿alguna idea?

No debería ser demasiado difícil. Algo como esto debería hacer el truco:

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

Keith ya te dio la respuesta, esta es solo otra forma de hacer lo mismo con un juego de una sola línea:

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

Aquí hay una versión que también funciona con hashtables / arrays nesteds (que es útil si estás intentando hacer esto con 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 } } } 

Esto funciona para PSCustomObjects creados por ConvertFrom_Json.

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

Descargo de responsabilidad: Apenas entiendo PowerShell por lo que probablemente no sea tan limpio como podría ser. Pero funciona (solo para un nivel).