我想知道如何解决循环遍历对象的集合,以群组而不是单独处理该集合的元素,就像普通的Foreach循环一样。例如,而不是:
$items = get-vm
foreach ($item in $items) { do something }
我想这样做:
$items = get-vm
foreach ((5)$item in $items) {do something}
基本上,这句话打算说项目中的5个项目做了一些工作......
有人能告诉我完成此任务所需的正确构造吗?
答案 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 }