【问题标题】:Why does Powershell combines array of arrays?为什么 Powershell 会组合数组?
【发布时间】:2016-04-14 10:13:15
【问题描述】:

我在 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 考虑我的数组?这让我发疯了!

【问题讨论】:

  • $a = ,(123,456,789)
  • 对不起,如果这听起来很愚蠢,但你能解释一下这个语法吗?就连微软的文档也很含糊technet.microsoft.com/en-us/library/hh847882.aspx
  • @jdel PowerShell 试图通过扁平化 1 大小的数组来“提供帮助”,这样您就不会在不需要它们时意外地得到嵌套结构

标签: arrays powershell multidimensional-array


【解决方案1】:

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

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

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

【讨论】:

  • 使用一元运算符 , 将阻止 Powershell 展开数组。
【解决方案2】:

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

@(@(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]

因此,当您编写 @(collection) 时,PowerShell 返回集合的副本,而不是包装到单个元素数组中的 collection。如果要创建具有单个元素的数组,则应使用一元逗号运算符:,expression。无论expression是否返回集合,这将创建单个元素数组。

另外,当你写@(a,b,c,etc)时,它是二进制逗号,它创建数组。数组子表达式运算符只是复制该数组。但是为什么你需要一个副本?是什么原因,为什么不能使用原始数组?您只需省略@ 字符:(a,b,c,etc)

【讨论】:

  • 谢谢,原理明白了。我总是使用 @ 来制作数组,因为在 about_Arrays 中它被称为数组运算符。我的问题是我需要构建一个多维数组,它的行为总是如此,无论是一个数组还是多个数组。我玩弄了逗号运算符,但我无法正确处理。
  • 我觉得不理解这个数组的东西真的很愚蠢,但这两个例子让我更加困惑:PS C:\Users\> $a = ,(123,456),(789) PS C:\ Users\> foreach ($b in $a[0]) {write-host "--> $b"} --> 123 456 PS C:\Users\> foreach ($b in $a[1]) { write-host "--> $b"} --> 789 PS C:\Users\> $a = ,(123,456) PS C:\Users\> foreach ($b in $a[0]) {write-主机 "--> $b"} --> 123 --> 456 PS C:\Users\> foreach ($b in $a[1]) {write-host "--> $b"}
  • @jdel 这里重要的是一元逗号比二元逗号具有更高的优先级。这样,(123,456),(789)(,(123,456)),(789) 相同。在 JSON 表示法中,它看起来像 [[[123,456]],789]$a[0] 将是[[123,456]]$a[0][0] 将是[123,456]$a[0][0][0] 将是123$a[0][0][1] 将是456$a[1] 将是789
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2013-12-29
  • 2015-07-07
  • 2011-02-22
  • 1970-01-01
  • 2016-10-19
  • 2015-02-24
相关资源
最近更新 更多