PowerShell从函数返回单个元素数组

时间:2014-01-08 10:49:24

标签: arrays function powershell

今天我注意到PowerShell的一个感兴趣的行为,我做了以下代码来展示它。当你跑:

function test()
{
    $a = @(1,2);
    Write-Host $a.gettype()
    return $a;
}

$b = test
Write-Host $b.gettype();

你得到的是:

System.Object[]
System.Object[]

但是,当您将代码更改为:

function test()
{
    $a = @(1);
    Write-Host $a.gettype()
    return $a;
}

$b = test
Write-Host $b.gettype();

你会得到:

System.Object[]
System.Int32

有人可以提供有关此“功能”的更多详细信息吗?似乎PowerShell规范没有提到这一点。

感谢。


BTW,我测试了PowerShell版本2,3及其上的代码。 4。

2 个答案:

答案 0 :(得分:5)

Powershell会在某些情况下自动“解包”数组,在您的情况下为赋值:

PS> (test).GetType()
System.Object[]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS> $b = test
System.Object[]
PS> $b.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

您可以通过在作业中明确引入数组来解决这个问题:

$b = ,(test)

答案 1 :(得分:-2)

它告诉你它是一个对象,因为技术上它是。

PS C:\Users\Administrator> $arr = @(1,2,3,4,5)
PS C:\Users\Administrator> $arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

请注意, BaseType System.Array

但是当您使用Write-Host输出时,它只是告诉您它是System.Object[]

PS C:\Users\Administrator> Write-Host $arr.GetType()
System.Object[]

就像那样。

因此,从逻辑上讲,我们可以根据上表运行以下命令,找出BaseType

PS C:\Users\Administrator> Write-Host $arr.GetType().BaseType
System.Array