PowerShell -- 寻找相当于 Perl 重做的内容



我有以下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循环计数器。

对于for循环,有没有与Perl的redo函数等效的Powershell命令?

我可以很容易地将该语句转换为while循环来解决这个特定问题,但我想知道是否存在类似redo的内容。

我很确定PowerShell不支持您想要的内容。您可以标记break和continue语句,但它们都不会将您带到相关循环/开关结构内部的顶部。如果PowerShell有一个goto语句,你会被设置,但我很高兴它没有这个关键字。:-)有关标记为break/contence的更多信息,请参阅about_break帮助主题。

与Perl的redo等价的版本会很好,我希望他们在未来的版本中引入它,但主要是因为它在Foreach ObjectForeachwhile循环中很有用。

但是,在for循环中,至少在一个典型的循环中,您可以通过简单地反转continue语句前的增量来轻松地再现功能。

在这种情况下,由于increment语句(PowerShell文档中的<repeat>)是$color++,因此只需将$color--紧跟在continue之前。为了清晰/优雅,我建议将它们放在一行上,使其更清楚地表明它本质上是一个单回路控制结构:

$color--; continue

我能想到为什么这永远不会奏效的唯一原因:

  • 否则,您将在循环中操纵循环变量。但我认为这是一种糟糕的编程风格,任何这样做的人都应该休息一下。)
  • 您有一个条件,它取决于可以在循环中更改的其他变量,例如for ($i = 0; $i -lt $j; $i++),其中$j可以在循环内更改

最新更新