为什么PowerShell会自动展平数组?

时间:2019-07-14 00:00:06

标签: arrays powershell pipeline jagged-arrays

我写了一些pwsh代码

"a:b;c:d;e:f".Split(";") | ForEach-Object { $_.Split(":") }
# => @(a, b, c, d, e, f)

但是我想要这个

// in javascript
"a:b;c:d;e:f".split(";").map(str => str.split(":"))
[ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ]

嵌套数组

@(
    @(a, b),
    @(c, d),
    @(e, f),
)

为什么?以及我该怎么办

3 个答案:

答案 0 :(得分:6)

使用,(PowerShell的数组构造运算符)的一元形式:

"a:b;c:d;e:f".Split(";") | ForEach-Object { , $_.Split(":") }

这样,$_.Split(":")返回的数组将按原样作为 array 输出,而不是使其元素逐个输出 ,默认情况下,这会在PowerShell管道中发生。

,有效地创建了-瞬态-包装器数组,其唯一元素是您要输出的数组。然后,PowerShell 将输出的包装器数组解包,将包装的数组传递通过。

答案 1 :(得分:0)

对于foreach-object,解开数组通常很有用:

ps | foreach modules | sort -u modulename

答案 2 :(得分:0)

您也可以创建堆栈或队列。 下面,我用您的数组创建了一个堆栈。

$array = "a:b;c:d;e:f".Split(";")
$stack = New-Object -TypeName System.Collections.Stack
$array | ForEach-Object { $stack.Push($_.Split(":")) }

从这里开始,最常用的方法是.Push()将新项目插入堆栈中,.Peek()使用堆栈的第一项,.Pop()检索然后删除第一项。

您提到要创建一个数组。也可以通过使用ToArray()方法来实现。

$stackArray = $stack.ToArray()
$stackArray[2]
> a
> b

请记住,创建堆栈会颠倒商品的顺序。