powershell foreach嵌套数组未显示预期输出

时间:2017-11-10 15:26:03

标签: arrays powershell nested

我不明白为什么它循环不好。

$a = @("server1", "server2", "server3")
$b = @(121, 453, 565)
foreach ($element in $a) {
  foreach ($element2 in $b) {
    Write-Host $element " load is: " $element2
  } 
}

输出:

server1  load is:  121
server1  load is:  453
server1  load is:  565
server2  load is:  121
server2  load is:  453
server2  load is:  565
server3  load is:  121
server3  load is:  453
server3  load is:  565

我期待以下输出:

server1 load is: 121
server2 load is: 453
server3 load is: 565

我不明白我该如何解决它。 谢谢!

3 个答案:

答案 0 :(得分:2)

你在foreach循环中有一个foreach循环,因此你得到3 * 3 = 9行。

执行所需操作的正确方法是按索引引用数组。

$a = @("server1", "server2", "server3")
$b = @(121, 453, 565)
for ($i=0; $i -lt $a.length; $i++) 
{ 
  write-host $a[$i] load is: $b[$i] 
}

答案 1 :(得分:0)

你有一个3元素循环嵌套在3元素循环中,因此为什么你得到9个结果。你想要做的是同时逐步完成两个数组。

$a = @("server1", "server2", "server3")
$b = @(121, 453, 565)

for($index = 0; $index -lt $a.Count;$index++){
    Write-Host "$($a[$index]): $($b[$index])"
}

0..($a.Count - 1) | Foreach-Object{
    Write-Host $a[$_]: $b[$_]
}

这两个解决方案都假设$a$b具有相同数量的元素。默认情况下,请求不存在不是PowerShell中的错误。将返回$null

对于你如何处理这些,你最好使用哈希表。这将更好地构建并消除一些潜在的失败点。然后,您可以在一个循环中迭代每个键值对

$a = @{
    "server1"= 121
    "server2"= 453
    "server3"= 565
}

$a.GetEnumerator() | ForEach-Object{
    Write-Host $_.Key": " $_.value
}

答案 2 :(得分:0)

其他解决方案:

$a = @("server1", "server2", "server3")
$b = @(121, 453, 565)
$i=0;
$a | %{"{0} load is: {1}" -f $_, $b[$i++]}