PowerShell中的数组数组:缺少逗号会产生意外行为

时间:2014-08-20 04:13:22

标签: arrays powershell

在PowerShell 4.0,Win 8.1中,如果我运行此脚本:

$x = @(
    ("one","two","three"),
    ("four", "five", "six"),
    ("seven", "eight", "nine")
    )

write-host $x.Count
$x | % {write-host "$_"}

我得到了

3
one two three
four five six
seven eight nine

如果我运行完全相同的脚本,但在三个子阵列中的每一个之间删除了逗号:

$x = @(
    ("one","two","three")
    ("four", "five", "six")
    ("seven", "eight", "nine")
    )

write-host $x.Count
$x | % {write-host "$_"}

我得到了

9
one
two
three
four
five
six
seven
eight
nine

有趣的是,在删除了逗号的版本中,新行必须存在。如果我删除它们,脚本将无法运行并提供"意外令牌'('在表达式或声明中#34;作为原因。

为什么会这样?我的期望是,无论是否存在换行符,它都不应该没有逗号。当我在一个类似值的长数组的底部添加一个新的子数组值但是忘记了逗号时,这就让我感到困惑,并且处理完全被搞砸了最后一个值。

1 个答案:

答案 0 :(得分:2)

在第一个示例中,您要定义一个二维数组,并获得预期的行为。

在第二个例子中,你正在做的是定义一个单维数组,基本上与此相同:

$x = @("one","two","three","four","five","six","seven","eight","nine")

除非您使用括号对其进行分组。这就是为什么你需要换行的原因,因为PowerShell正在解析括号内的"一个",就像它执行任何命令一样。并且你不能在同一行上有几个命令而没有换行符(或者&#39 ;;')

要验证,请改为尝试:

$x = @(("one","two","three");("four","five","six");("seven","eight","nine"))