今天我注意到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。
答案 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