Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays PowerShell从函数返回单个元素数组_Arrays_Function_Powershell - Fatal编程技术网

Arrays 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);

今天我注意到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规范没有提到这一点

谢谢


顺便说一句,我在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
。不知何故,即使通过赋值,这也保留了单个元素数组。