将a转换PSCustomObject
为a的最简单方法是Hashtable
什么?它与splat运算符,大括号和看起来像键值对的显示一样。当我尝试将其投射到[Hashtable]
它不起作用时。我也尝试过.toString()
,分配的变量说它是一个字符串,但是什么也不显示-有什么想法吗?
Answers:
不应该太难。这样的事情应该可以解决问题:
# 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 }
$_.Name
该字符串已经是一个字符串,因此$ht2[$_.Name]
or$h.($_.Name)
会和一样工作"$($_.Name)"
。
ConvertFrom-Json
本身的使用,而后者本身也会产生[PSCustomObject]
实例。换句话说:产生非嵌套对象的JSON源就可以正常工作;例如:('{ "foo": "bar" }' | ConvertFrom-Json).psobject.properties | % { $ht = @{} } { $ht[$_.Name] = $_.Value } { $ht }
Keith已经为您提供了答案,这只是单线执行此操作的另一种方式:
$psobject.psobject.properties | foreach -begin {$h=@{}} -process {$h."$($_.Name)" = $_.Value} -end {$h}
$'s
缺少一些_'s
。:-)
%
和位置参数作为块,则可以缩短为$psobject.psobject.properties | % { $ht = @{} } { $ht[$_.Name] = $_.Value } { $ht }
。@Rubanov:不必位于一行上,但优点是可以由单个语句(管道)创建哈希表。
这是一个也可与嵌套哈希表/数组一起使用的版本(如果您要使用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
}
}
}
@{ Name = "test1"; nested = @{ license = 'x'; cert = 'y' } } | Convert-PSObjectToHashTable
相反,我不得不GetEnumerator()
在第15行添加一个:foreach ($object in $InputObject.GetEnumerator()) { ConvertPSObjectToHashtable $object }
我极其懒惰的方法,通过PowerShell 6中的一项新功能启用:
$myhashtable = $mypscustomobject | ConvertTo-Json | ConvertFrom-Json -AsHashTable
这适用于由ConvertFrom_Json创建的PSCustomObjects。
Function ConvertConvertFrom-JsonPSCustomObjectToHash($obj)
{
$hash = @{}
$obj | Get-Member -MemberType Properties | SELECT -exp "Name" | % {
$hash[$_] = ($obj | SELECT -exp $_)
}
$hash
}
免责声明:我几乎不了解PowerShell,因此它可能不尽如人意。但这有效(仅适用于一个级别)。
$hash=@{};$obj | Get-Member -MemberType Properties | foreach { $hash.Add($_.Name,$obj.($_.Name))}
我的代码:
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
}
}