如何在PowerShell foreach循环中重复迭代?

时间:2016-04-07 11:01:56

标签: loops powershell foreach

我经常需要在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循环重新进行迭代吗?

2 个答案:

答案 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-Objectforeach的混合以简化自动IEnumeration对象 $ foreach 的范围。

修改

我认为包含一个描述input type="text" name="activeTill" class="form-control" style="width:150px;" value="<?php echo $row['news_active_till']; ?>" id="dateTill"/> 关键字 cmdlet 之间区别的页面链接很有用: