Loops Powershell能否一次循环通过N个对象的集合?
我想知道如何处理对象集合中的循环,分组处理该集合中的元素,而不是像正常的Foreach循环那样单独处理。例如,与此相反: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项中的每一项都做一些工作 有人能告诉我完成这项任务所需的正确构造吗?更改为执行…直到,每次递增
$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。