为什么Powershell结合了数组?

时间:2016-04-14 10:13:15

标签: arrays powershell multidimensional-array

我在Powershell脚本中使用数组数组,但是,有时,我的数组数组实际上只包含一个数组。 出于某种原因,Powershell只用一个数组来替换包含一个数组的数组。我没有得到它,我之前没有使用过其他任何脚本/编码语言。

示例,这是我不想要的:

PS C:\Users\> $a = @(@(123,456,789))
PS C:\Users\> $a[0]
123

这就是我想要的:

PS C:\Users\> $a = @(@(123,456,789), @())
PS C:\Users\> $a[0]
123
456
789

为什么我必须为Powershell强制一个额外的空数组来考虑我的数组数组,因为它只包含一个数组?这让我疯了!

2 个答案:

答案 0 :(得分:2)

您需要将逗号作为第一项:

 $a = @(, @(123,456,789) )

原因是逗号本质上是数组构造参数。这个MSDN article有更多信息。

答案 1 :(得分:0)

@()运算符将其内容解释为语句而不是表达式。让我们明确;

@(@(123,456,789;);)

你在这里有什么:

  1. 123,456,789 - 二进制逗号运算符创建一个包含三个元素的数组 结果:数组[123,456,789]
  2. 123,456,789; - 作为此语句返回集合中的表达式,PowerShell枚举此集合并将集合的元素(不是集合本身)写入管道。
    结果:写入管道的三个元素123456789
  3. @(123,456,789;) - 数组子表达式运算符收集所有写入管道的项目,这些项目是调用嵌套语句并从中创建数组的。 结果:数组[123,456,789]
  4. @(123,456,789;); - 作为此语句返回集合中的表达式,PowerShell枚举此集合并将集合的元素(不是集合本身)写入管道。
    结果:写入管道的三个元素123456789
  5. @(@(123,456,789;);) - 数组子表达式运算符收集所有写入管道的项目,这些项目是调用嵌套语句并从中创建数组的。 结果:数组[123,456,789]
  6. 因此,当您编写@(collection)时,PowerShell会返回集合的副本,而不是collection包装到单个元素数组中。如果要使用单个元素创建数组,则应使用一元逗号运算符:,expression。无论是否expression返回集合,这都将创建单个元素数组。

    此外,当您编写@(a,b,c,etc)时,它是二进制逗号,谁创建数组。 Array子表达式运算符只是复制该数组。但为什么需要副本?有什么原因,为什么你不能使用原装阵列?您不需要额外复制的所有内容只是省略@字符:(a,b,c,etc)