Loops Powershell能否一次循环通过N个对象的集合?

Loops Powershell能否一次循环通过N个对象的集合?,loops,powershell,foreach,Loops,Powershell,Foreach,我想知道如何处理对象集合中的循环,分组处理该集合中的元素,而不是像正常的Foreach循环那样单独处理。例如,与此相反: $items = get-vm foreach ($item in $items) { do something } 我想这样做: $items = get-vm foreach ((5)$item in $items) {do something} 本质上,这句话的意思是说每5项中的每一项都做一些工作 有人能告诉我完成这项任务所需的正确构造吗?更改为执行…直到,每次递增

我想知道如何处理对象集合中的循环,分组处理该集合中的元素,而不是像正常的Foreach循环那样单独处理。例如,与此相反:

$items = get-vm
foreach ($item in $items) { do something }
我想这样做:

$items = get-vm
foreach ((5)$item in $items) {do something}
本质上,这句话的意思是说每5项中的每一项都做一些工作


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

更改为执行…直到,每次递增计数器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)
输出:

05101525253054045055606707580859095100105110 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)
我有这个:

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

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

下面是一个函数,用于将项目收集到指定大小的块中:

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 }

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

#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整除的次数,这是本例中所需的子组数量……

此示例似乎显示了对数组中每五个元素的处理。我所寻求的是一次五批处理整个阵列。使用您的活动,即简单地打印元素,我希望看到五个数字的组。例如:12345 678910 11121311415等等……请后退一步,描述您试图解决的实际问题,而不是您认为的解决方案。为什么你认为你需要一批处理5个虚拟机,而不是按顺序处理?FWIW我想处理我的最后一个组,即使它不包含完整的组大小,所以我将
($I-ge$array.count-1)
更改为
($I-gt$array.count-1)
,只是为了澄清@markschultheis的评论。如果最后一个组在表达式:
$array.Length%$group
中有剩余的1,则使用-ge只会隐藏最后一个组。(%是模运算符)因此,如果不希望剩余1的组显示use-ge,则使用-gt。