Powershell可以一次循环收集N个对象吗?

时间:2013-11-20 16:35:24

标签: loops powershell foreach

我想知道如何解决循环遍历对象的集合,以群组而不是单独处理该集合的元素,就像普通的Foreach循环一样。例如,而不是:

$items = get-vm
foreach ($item in $items) { do something }

我想这样做:

$items = get-vm
foreach ((5)$item in $items) {do something}

基本上,这句话打算说项目中的5个项目做了一些工作......

有人能告诉我完成此任务所需的正确构造吗?

4 个答案:

答案 0 :(得分:4)

我有这个:

 $array = 1..100
 $group = 10
 $i = 0

 do {
     $array[$i..(($i+= $group) - 1)]
     '*****'
     }
      until ($i -ge $array.count -1)

答案 1 :(得分:1)

你们肯定给了我一些关于这个功能的好主意。我最终得到了以下内容:

#create base collection
$group = get-vm
$i = 0

do {
    new-variable -Name "subgroup$i" -value $group[0..4]
    ++$i
    $group = $group[5..$group.length]
}
while ($group.length -gt 0)

此代码产生了许多子组,这些子组基于基础集合可被5整除的次数,在这种情况下,这是所需的子组数量......

答案 2 :(得分:0)

更改为Do ...直到每次增加5为止。

$items = get-vm
$i = 0
do {
#STUFF
$i = $i + 5
} until ($i -ge $items.count)

(未经测试,但应该给你一个想法)

修改 经过全面测试:

$items = @()
foreach ($item in (get-alias)) {
$items += $item
}

$i = 0
do {
write-host $i
$i = $i + 5
} until ($i -ge $items.count)

输出:

  

0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110   115 120 125 130 135

编辑2:

$items = @()
for($i=1; $i -le 75; $i++) {
$items += $i
}

[int]$i = 0
$outarray = @()
do {
$outarray += $items[$i]
if ((($i+1)%5) -eq 0) {
    write-host $outarray
    write-host ---------
    $outarray = @()
}

$i = $i + 1
} until ($i -gt $items.count)

答案 3 :(得分:0)

这是一个将项目收集到指定大小的块中的函数:

function ChunkBy($items,[int]$size) {
    $list = new-object System.Collections.ArrayList
    $tmpList = new-object System.Collections.ArrayList
    foreach($item in $items) {
        $tmpList.Add($item) | out-null
        if ($tmpList.Count -ge $size) {
            $list.Add($tmpList.ToArray()) | out-null
            $tmpList.Clear()
        }
    }

    if ($tmpList.Count -gt 0) {
        $list.Add($tmpList.ToArray()) | out-null
    }

    return $list.ToArray()
}

用法如下:

ChunkBy (get-process) 10 | foreach { $_.Count }