我经常需要在PowerShell中循环遍历数据集(SQL结果,计算机列表等),每次都执行相同的操作(例如函数X)。我几乎完全使用foreach
循环,因为它们简单,有效且易于理解,可能需要遵循我的代码。
在重试失败的操作(最多Y次)的意义上,我想让我的一些代码更健壮。有多种方法可以实现这一点,例如在 foreach循环中,将函数X包装在do{} while()
循环中。在此示例中,假设函数X仅在“成功”时返回非空结果:
foreach($dataitem in $dataset){
$Result = $null
$Attempts = 0
do{
$Attempts++
$Result = <call function X on $dataitem>
} while(($Attempts -lt 3) -and (-not $Result))
}
我想知道是否有任何方法可以平衡这个逻辑,即使用foreach循环的更高级方法,所以我可以取消do{} while()
循环。
我遇到了与我想要的相反的东西,即使用$foreach.MoveNext()
在循环中向前跳过,但是没有找到任何(危险的?)会保持foreach处理相同的项目。
基本上:可以使用foreach循环重新进行迭代吗?。
答案 0 :(得分:2)
我不会尝试重新执行foreach循环的迭代。这对我来说不合适。相反,我会创建一个实现类似retry-logic
模式的函数:
function Retry-Process()
{
Param(
[scriptblock]$action,
[scriptBlock]$validator,
[int]$retryCount
)
1 .. $retryCount | % {
$result = & $action
if (& $validator ($result))
{
$result
break
}
}
}
示例电话:
Retry-Process -action { '3' } -validator { Param($a) $a -eq '3'} -retryCount 5
在你的foreach循环中:
foreach($dataitem in $dataset) {
$Result = Retry-Process `
-action { <call function X on $dataitem> } `
-validator { Param($returnValue) $returnValue } ` # Validate return value != null
-retryCount 3
}
答案 1 :(得分:1)
虽然我同意Jisaak,但回答你的问题,你可以使用类似下面的内容来实现这个目标
foreach() {}
当然,除了练习外,我不会做任何愚蠢的事情。完成Foreach-Object
和foreach
的混合以简化自动IEnumeration对象 $ foreach 的范围。
我认为包含一个描述input type="text" name="activeTill" class="form-control" style="width:150px;" value="<?php echo $row['news_active_till']; ?>" id="dateTill"/>
关键字与 cmdlet 之间区别的页面链接很有用: