如何从Powershell v3中的哈希数组生成PSCustomObjects数组?

时间:2015-04-09 20:19:18

标签: powershell powershell-v3.0

假设我在Powershell v3中有一系列哈希值:

> $hashes = 1..5 | foreach { @{Name="Item $_"; Value=$_}}

我可以将单个哈希转换为PSCustomObject,如下所示:

> $co = [PSCustomObject] $hashes[0]
> $co | ft -AutoSize

Value Name  
----- ----  
    1 Item 1

> $co.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object 

到目前为止,这么好。当我尝试将整个哈希数组转换为管道中的PSCustomObjects时,会出现问题:

> ($hashes | foreach { [PSCustomObject] $_})[0].getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     -------- 
True     True     Hashtable                                System.Object

如您所见,我获得了Hashtable个对象的数组,而不是PSCustomObjects。为什么我会得到不同的行为,我怎样才能完成我想要的?

感谢。

4 个答案:

答案 0 :(得分:2)

请尝试直接调用New-Object,而不是投射:

# > ($hashes | foreach { New-Object -TypeName PSCustomObject -Property $_})[0].getType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                  
-------- -------- ----                                     --------                                                                                                                                                  
True     False    PSCustomObject                           System.Object    

另外,奇怪的是,这似乎有效:

# > (0..4 |  foreach { ([PSCustomObject]$hashes[$_])})[0].GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                  
-------- -------- ----                                     --------                                                                                                                                                  
True     False    PSCustomObject                           System.Object                   

为什么呢?我不知道,使用流水线哈希表条目执行转换似乎有困难。

答案 1 :(得分:2)

我还没有找出确切的原因(每个人都在学习一些东西)但是你的问题与$_管道元素有某种关系。如果我强制执行$_

的演员,我可以让你的代码工作
$hashes = 1..5 | foreach { @{Name="Item $_"; Value=$_}}
$hashes | %{([pscustomobject][hashtable]$_)}

<强>输出

Value Name  
----- ----  
    1 Item 1
    2 Item 2
    3 Item 3
    4 Item 4
    5 Item 5

好奇的东西

我不喜欢NameValue,而我正在测试(这就是文字哈希表对标题的影响,我在测试时发现它令人困惑),所以我改变了稍后到Data然后输出不同。我只是因为好奇而发布它。在帖子中很难显示结果。

Name                                                                                                                                                     Data
----                                                                                                                                                     ----
Item 1                                                                                                                                                      1
Item 2                                                                                                                                                      2
Item 3                                                                                                                                                      3
Item 4                                                                                                                                                      4
Item 5                                                                                                                                                      5

答案 2 :(得分:1)

这似乎有效:

$hashes = 1..5 | foreach { @{Name="Item $_"; Value=$_}}

foreach ($hash in $hashes)
{([PSCustomObject]$hash).gettype()}

答案 3 :(得分:1)

似乎管道变量$_的值被包装到PSObject中,并且会将其转换为PSCustomObject

> $hashes=@{Value=1},[PSObject]@{Value=2}

> $hashes[0].GetType().FullName
System.Collections.Hashtable
> $hashes[1].GetType().FullName
System.Collections.Hashtable
# It seems that both $hashes elements are Hashtable,

> [Type]::GetTypeArray($hashes).FullName
System.Collections.Hashtable
System.Management.Automation.PSObject
# But, as you can see, second one is not.

> ([PSCustomObject]$hashes[0]).GetType().FullName
System.Management.Automation.PSCustomObject
> ([PSCustomObject]$hashes[1]).GetType().FullName
System.Collections.Hashtable
# And that difference break cast to PSCustomObject.