我在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强制一个额外的空数组来考虑我的数组数组,因为它只包含一个数组?这让我疯了!
答案 0 :(得分:2)
答案 1 :(得分:0)
@()
运算符将其内容解释为语句而不是表达式。让我们明确;
。
@(@(123,456,789;);)
你在这里有什么:
123,456,789
- 二进制逗号运算符创建一个包含三个元素的数组
结果:数组[123,456,789]
。123,456,789;
- 作为此语句返回集合中的表达式,PowerShell枚举此集合并将集合的元素(不是集合本身)写入管道。123
,456
和789
。@(123,456,789;)
- 数组子表达式运算符收集所有写入管道的项目,这些项目是调用嵌套语句并从中创建数组的。
结果:数组[123,456,789]
。@(123,456,789;);
- 作为此语句返回集合中的表达式,PowerShell枚举此集合并将集合的元素(不是集合本身)写入管道。123
,456
和789
。@(@(123,456,789;);)
- 数组子表达式运算符收集所有写入管道的项目,这些项目是调用嵌套语句并从中创建数组的。
结果:数组[123,456,789]
。因此,当您编写@(collection)
时,PowerShell会返回集合的副本,而不是collection
包装到单个元素数组中。如果要使用单个元素创建数组,则应使用一元逗号运算符:,expression
。无论是否expression
返回集合,这都将创建单个元素数组。
此外,当您编写@(a,b,c,etc)
时,它是二进制逗号,谁创建数组。 Array子表达式运算符只是复制该数组。但为什么需要副本?有什么原因,为什么你不能使用原装阵列?您不需要额外复制的所有内容只是省略@
字符:(a,b,c,etc)
。