Was ist der einfachste Weg, um a PSCustomObject
in a umzuwandeln Hashtable
? Es wird genau wie eins mit dem Splat-Operator, geschweiften Klammern und scheinbar Schlüsselwertpaaren angezeigt. Wenn ich versuche, es zu [Hashtable]
besetzen, funktioniert es nicht. Ich habe es auch versucht .toString()
und die zugewiesene Variable sagt, es sei eine Zeichenfolge, zeigt aber nichts an - irgendwelche Ideen?
powershell
hashtable
pscustomobject
alphadev
quelle
quelle
Antworten:
Sollte nicht zu schwer sein. So etwas sollte den Trick machen:
# 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 }
quelle
$_.Name
bereits eine Zeichenfolge ist,$ht2[$_.Name]
oder$h.($_.Name)
genauso gut funktioniert wie"$($_.Name)"
.ConvertFrom-Json
. Diese Frage behebt dieses Problem.ConvertFrom-Json
per se, die auch[PSCustomObject]
Instanzen erzeugt . Mit anderen Worten: Eine JSON-Quelle, die nicht verschachtelte Objekte erzeugt, funktioniert einwandfrei. zB:('{ "foo": "bar" }' | ConvertFrom-Json).psobject.properties | % { $ht = @{} } { $ht[$_.Name] = $_.Value } { $ht }
Keith hat Ihnen bereits die Antwort gegeben, dies ist nur eine andere Möglichkeit, dasselbe mit einem Einzeiler zu tun:
$psobject.psobject.properties | foreach -begin {$h=@{}} -process {$h."$($_.Name)" = $_.Value} -end {$h}
quelle
$'s
fehlen einige_'s
. :-)%
und Positionsparameter als Blöcke verwenden, können Sie auf kürzen$psobject.psobject.properties | % { $ht = @{} } { $ht[$_.Name] = $_.Value } { $ht }
. @ Rubanov: Es muss nicht in einer einzelnen Zeile stehen , aber der Vorteil ist, dass eine einzelne Anweisung (Pipeline) die Hashtabelle erstellt.Hier ist eine Version, die auch mit verschachtelten Hashtabellen / Arrays funktioniert (was nützlich ist, wenn Sie dies mit DSC ConfigurationData versuchen):
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 } } }
quelle
ConvertFrom-Json
. Siehe auch diese Frage@{ Name = "test1"; nested = @{ license = 'x'; cert = 'y' } } | Convert-PSObjectToHashTable
Stattdessen musste ich inGetEnumerator()
Zeile 15foreach ($object in $InputObject.GetEnumerator()) { ConvertPSObjectToHashtable $object }
Mein extrem fauler Ansatz, der durch eine neue Funktion in PowerShell 6 ermöglicht wird:
$myhashtable = $mypscustomobject | ConvertTo-Json | ConvertFrom-Json -AsHashTable
quelle
Dies funktioniert für PSCustomObjects, die von ConvertFrom_Json erstellt wurden.
Function ConvertConvertFrom-JsonPSCustomObjectToHash($obj) { $hash = @{} $obj | Get-Member -MemberType Properties | SELECT -exp "Name" | % { $hash[$_] = ($obj | SELECT -exp $_) } $hash }
Haftungsausschluss: Ich verstehe PowerShell kaum, daher ist dies wahrscheinlich nicht so sauber wie es sein könnte. Aber es funktioniert (nur für eine Ebene).
quelle
$hash=@{};$obj | Get-Member -MemberType Properties | foreach { $hash.Add($_.Name,$obj.($_.Name))}
Mein 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 } }
quelle