84

を に変換する最も簡単な方法は何PSCustomObjectですかHashtable? スプラット演算子、中括弧、およびキーと値のペアのように見えるものと同じように表示されます。キャストしようとするとうまくいき[Hashtable]ません。私も試し.toString()てみましたが、割り当てられた変数は文字列であると言っていますが、何も表示されません-何かアイデアはありますか?

4

6 に答える 6

109

難しすぎてはいけません。このような何かがうまくいくはずです:

# 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 }
于 2010-09-18T04:38:18.763 に答える
35

キースはすでに答えを出しています。これは、ワンライナーで同じことを行う別の方法です。

$psobject.psobject.properties | foreach -begin {$h=@{}} -process {$h."$($_.Name)" = $_.Value} -end {$h}
于 2010-09-18T15:48:37.993 に答える
30

ネストされたハッシュテーブル/配列でも動作するバージョンを次に示します (これは、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
        }
    }
}
于 2015-12-20T16:55:29.410 に答える
16

PowerShell 6 の新機能によって可能になった、私の非常に怠惰なアプローチ:

$myhashtable = $mypscustomobject | ConvertTo-Json | ConvertFrom-Json -AsHashTable
于 2020-05-12T01:57:07.157 に答える
3

これは、ConvertFrom_Json によって作成された PSCustomObjects で機能します。

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

免責事項: 私は PowerShell をほとんど理解していないため、これはおそらくそれほど明確ではありません。しかし、それは機能します(1つのレベルのみ)。

于 2015-08-19T17:30:14.757 に答える