我有以下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
的内容。
答案 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
可以在循环中更改。