如何在Powershell中将字符串连接到嵌套数组中的值?

问题描述

我有一个嵌套数组@(@('1','3'),@('5','7','9'),@('2','4','6'))

$podnumbers = (3,2,2)
$buffer = 0
$podNarr = foreach ($pd in $podnumbers) {
    $podNarr1 = for($i=0;$i -lt $pd;$i = $i+1) {
      Read-Host -Prompt "Assign the pod numbers"
    },$podNarr1
    $buffer = $buffer + 1
   }

$podNarr | ForEach-Object {
    Write-Host Object type: $_.gettype().BaseType.name
    Write-Host Member count: $_.count
    Write-Host Values: $_
}

以下是上述代码块的输出

Object type: Array
Member count: 2
Values: 1 3
Object type: Array
Member count: 3
Values: 2 4 6
Object type: Array
Member count: 3
Values: 5 7 9
    

我正在尝试使用以下代码端口组-连接到嵌套数组中的值

$port = "Port Group-"
$portarr = $podNarr | ForEach-Object {
      $port + $_
    }
Write-Output `n
$portarr | ForEach-Object {
    Write-Host Values: $_
}

以上代码产生的输出为:

Values: Port Group-1 3
Values: Port Group-2 4 6
Values: Port Group-5 7 9

我希望输出 @(@('Port Group-1','Port Group-3'),@('Port Group-5','Port Group-7','Port Group -9'),@('Port Group-2','Port Group-4','Port Group-6'))

Values: Port Group-1 Port Group-3
Values: Port Group-2 Port Group-4 Port Group-6
Values: Port Group-5 Port Group-7 Port Group-9

如何实现我的目标?

解决方法

您需要两个for循环。一个循环遍历外部数组,第二个遍历嵌套数组。 foreach不会这样做,因为迭代和更改数组是互斥的操作。

$arr = @(@('1','3'),@('5','7','9'),@('2','4','6'))

# Here we traverse through the outer elements
for($a = 0; $a -lt $arr.length; ++$a) {

    # Process each nested array and update its value    
    for($b = 0; $b -lt $arr[$a].length; ++$b) {
        $arr[$a][$b] =  $("Port group-{0} "-f $arr[$a][$b])
    }
}

# Output
$arr | ForEach-Object {
    Write-Host Object type: $_.gettype().BaseType.name
    Write-Host Member count: $_.count
    Write-Host Values: $_
}

Object type: Array
Member count: 2
Values: Port group-1  Port group-3
Object type: Array
Member count: 3
Values: Port group-5  Port group-7  Port group-9
Object type: Array
Member count: 3
Values: Port group-2  Port group-4  Port group-6
,

我有这样的建议

@(@('1','6')) | foreach{
"Values: " + ($_|foreach{"Port Group-$_"})  
}

输出: enter image description here

,

如果您不强制输出变为数组,则Powershell会取消包装数组。 您可以通过在其前面加上一元逗号来强制此操作,该逗号将数组包装在另一个1元素数组中。展开该部分后,将保留原始数组。

类似

$a = @(@('1','6'))
$b = $a | ForEach-Object {
    $c = foreach ($port in $_) { 'Port Group-{0}' -f $port }
    # output this array as ARRAY by wrapping it in a 1-element new array using the unary comma,$c
}


Write-Host $b[0]
Write-Host $b[1]
Write-Host $b[2]

输出

Port Group-1 Port Group-3
Port Group-5 Port Group-7 Port Group-9
Port Group-2 Port Group-4 Port Group-6

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...