假设我在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
。为什么我会得到不同的行为,我怎样才能完成我想要的?
感谢。
答案 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
好奇的东西
我不喜欢Name
和Value
,而我正在测试(这就是文字哈希表对标题的影响,我在测试时发现它令人困惑),所以我改变了稍后到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.