PowerShell - 寻找相当于Perl的重做

时间:2012-03-29 19:31:24

标签: powershell for-loop

我有以下PowerShell循环:

Set-Variable -Name YELLOW -Option ReadOnly -Value 0
Set-Variable -Name ORANGE -Option ReadOnly -Value 1
Set-Variable -Name RED    -Option ReadOnly -Value 2

While ($true) {
    for ($color = $YELLOW; $color -le $RED; $color++) { 
        $LastWriteTime = ((Get-Item $FilePath).LastWriteTime)
        $waitTime = (Get-Date).AddMinutes(-($WarningTimeArray[$color]))
        $SleepTime = ($LastWriteTime - $waitTime).TotalSeconds
        If ($SleepTime -gt 0) {
            $WarningFlagArray[$color] = $false;
            SendMail ("Start-Sleep -Seconds" + $SleepTime)
            Start-Sleep -Seconds $SleepTime
            Continue  #Actually want a "redo"
        }
        ElseIf (-not $WarningFlagArray[$color]) {   
            SendMail $WarningMessageArray[$color]
           $WarningFlagArray[$color] = $true
        }
    }
}

当PowerShell点击“继续”时,它会继续回到for循环的顶部,然后转到下一个颜色。

在Perl中,您有last(相当于PowerShell的break)并且您拥有next(相当于PowerShell的continue)。您还可以使redo返回到循环的顶部,但不会递增for循环计数器。

redo循环的Perl的for函数是否有等效的Powershell命令?

我可以轻松地将语句转换为while循环以解决此特定问题,但我想知道是否还有类似redo的内容。

2 个答案:

答案 0 :(得分:1)

我非常确定PowerShell不支持您正在寻找的内容。您可以使用标记的break和continue语句,但两者都不会将您带到关联的循环/开关构造的 inside 的顶部。如果PowerShell有一个goto语句你会被设置但我很高兴它没有那个关键字。 :-)有关标记为break / continue的更多信息,请参阅about_break帮助主题。

答案 1 :(得分:0)

相当于Perl的 redo 会很好,我希望他们在将来的版本中引入它,但主要是因为它在 Foreach-Object中很有用 foreach while 循环。

但是,在 for 循环中,至少是一个典型循环,只需在 continue 语句之前立即反转增量即可轻松重现该功能。

在这种情况下,由于增量语句(PowerShell文档中的名为<repeat>)为$color++,因此请在$color--之前立即粘贴continue。为了清晰/优雅,我建议将它们放在一行,以使它更清楚,它本质上是一个单一的循环控制结构:

$color--; continue

我能想到为什么那样不起作用的唯一原因:

  • 您以其他方式操纵循环内的循环变量。但我认为这种可怕的编程风格和任何做这件事的人都应该让他们的脚本破解。 ;)
  • 您的条件取决于可在循环中更改的其他变量,例如: for ($i = 0; $i -lt $j; $i++) $j可以在循环中更改。