Why does PowerShell flatten arrays automatically?

前端 未结 3 1685
遇见更好的自我
遇见更好的自我 2021-01-18 13:32

I\'ve written some pwsh code

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


        
相关标签:
3条回答
  • 2021-01-18 14:08

    Use the unary form of ,, PowerShell's array-construction operator:

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

    That way, the array returned by $_.Split(":") is effectively output as-is, as an array, instead of having its elements output one by one, which happens by default in a PowerShell pipeline.

    , creates a - transient - wrapper array whose only element is the array you want to output. PowerShell then unwraps the wrapper array on output, passing the wrapped array through.

    0 讨论(0)
  • 2021-01-18 14:12

    You can alternatively create also a stack or a queue. Below, I created with your array a stack.

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

    From here, the most used methods are .Push() to insert new items to your stack, .Peek() to use the first item of the stack and .Pop(), to retrieve and then remove the first item.

    You mentioned that you wanted to create an array. This is also possible by using the ToArray() method.

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

    To keep in mind, creating a stack will inverse the order to the items.

    0 讨论(0)
  • 2021-01-18 14:15

    With foreach-object, it's usually useful to unwrap the array:

    ps | foreach modules | sort -u modulename
    
    0 讨论(0)
提交回复
热议问题