سؤال

ما هي أسهل طريقة لتحويل أ PSCustomObject إلى Hashtable؟ يعرض تمامًا مثل أحد مشغل SPLAT ، وأقواس مجعد وما يبدو أنه أزواج القيمة الرئيسية. عندما أحاول إلقاءها على [Hashtable] لا يعمل. لقد حاولت أيضا .toString() والمتغير المعين يقول إنه سلسلة ولكن لا يعرض أي شيء - أي أفكار؟

هل كانت مفيدة؟

المحلول

لا ينبغي أن يكون صعبا جدا. شيء من هذا القبيل يجب أن يفعل الخدعة:

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

نصائح أخرى

أعطاك كيث بالفعل الإجابة ، هذه مجرد طريقة أخرى لفعل الشيء نفسه مع خط واحد:

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

إليك نسخة تعمل مع علامات التجزئة / المصفوفات المتداخلة أيضًا (وهو أمر مفيد إذا كنت تحاول القيام بذلك باستخدام 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
        }
    }
}

هذا يعمل مع pscustomObjects التي تم إنشاؤها بواسطة ConvertFrom_Json.

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

إخلاء المسئولية: بالكاد أفهم PowerShell ، لذلك ربما لا يكون هذا نظيفًا كما يمكن أن يكون. لكنه يعمل (لمستوى واحد فقط).

رمز بلدي:

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
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top