Arrays PowerShell从函数返回单个元素数组
今天我注意到PowerShell有一个有趣的行为,我编写了以下代码来展示它。运行时:Arrays PowerShell从函数返回单个元素数组,arrays,function,powershell,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);
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规范没有提到这一点
谢谢
顺便说一句,我在PowerShell版本2、3和4上测试了代码。在某些情况下,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)
您可以在分配中显式引入数组:
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)
它告诉你它是一个物体,因为技术上它是
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
它告诉他们这是一个对象数组;请注意
[]
。有没有办法在函数定义中而不是在调用方中强制执行此操作?@Scott:我不知道。请记住,PowerShell是一种脚本语言,它是围绕消费和生成值列表而构建的,这是管道自然完成的。到目前为止,我发现能够将数组视为数组的唯一有价值的地方是,您可以脱离PowerShell的优势,尝试编写C#风格的代码而不是管道(或者传递数组数组而不是对象数组,它们遵循相同的路径)。所以总的来说,我认为这样做很麻烦甚至不是一个疏忽或设计错误。有一些Powershell的口袋,其中类型很重要。我的场景:我正在编写一个小的Powershell模块,将内部WCF端点封装在使用新WebServiceProxy的cmdlet中。代理方法将输入作为代理客户端生成的自定义类型,我有一个助手方法来构建它们。当我希望我的助手返回一个数组,而它给了我一个元素或null时,这很麻烦。现在,调用代码需要知道内部动态类型才能生成自己的空数组。不在函数定义中,但在函数中可以这样做。在函数的return语句中使用逗号:return,$value
。不知何故,即使通过赋值,这也保留了单个元素数组。