pscustomObject إلى hashtable
-
03-10-2019 - |
سؤال
ما هي أسهل طريقة لتحويل أ 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
}
}