我有以下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 Object、Foreach和while循环中很有用。
但是,在for循环中,至少在一个典型的循环中,您可以通过简单地反转continue语句前的增量来轻松地再现功能。
在这种情况下,由于increment语句(PowerShell文档中的<repeat>
)是$color++
,因此只需将$color--
紧跟在continue
之前。为了清晰/优雅,我建议将它们放在一行上,使其更清楚地表明它本质上是一个单回路控制结构:
$color--; continue
我能想到为什么这永远不会奏效的唯一原因:
- 否则,您将在循环中操纵循环变量。但我认为这是一种糟糕的编程风格,任何这样做的人都应该休息一下。)
- 您有一个条件,它取决于可以在循环中更改的其他变量,例如
for ($i = 0; $i -lt $j; $i++)
,其中$j
可以在循环内更改