PowerShell - в поисках эквивалента повторения Perl - PullRequest
0 голосов
/ 29 марта 2012

У меня есть следующий цикл 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 (эквивалент continue PowerShell). У вас также есть redo, который возвращается к вершине цикла, но не увеличивает счетчик цикла for.

Существует ли эквивалентная команда Powershell для функции redo в Perl для цикла for?

Я могу легко преобразовать оператор в цикл while, чтобы обойти эту конкретную проблему, но мне было интересно, есть ли что-то вроде redo в любом случае.

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Я уверен, что PowerShell не поддерживает то, что вы ищете. Вы можете пометить операторы break и continue, но ни один из них не приведет вас к вершине внутри связанной конструкции loop / switch. Если бы у PowerShell был статус goto, вы были бы настроены, но я рад, что у него нет этого ключевого слова. :-) Для получения дополнительной информации о помеченном break / continue см. Раздел справки about_break.

0 голосов
/ 16 сентября 2016

Было бы неплохо использовать Perl redo , и я надеюсь, что они появятся в следующей версии, но в основном потому, что это будет полезно в Foreach-Object , foreach и , в то время как циклы.

Тем не менее, в цикле для , по крайней мере, типичном, вы можете легко воспроизвести функциональность, просто обращая инкремент непосредственно перед оператором continue .

В этом случае, поскольку оператор приращения (он же <repeat> в документации PowerShell) равен $color++, просто введите $color-- непосредственно перед continue. Для ясности / элегантности, я бы предложил поместить их в одну строку, чтобы было яснее, что это по сути одноконтурный элемент управления:

$color--; continue

Единственные причины, по которым я могу думать, почему это никогда не сработает:

  • В противном случае вы манипулируете переменной цикла внутри цикла. Но я думаю, что это ужасный стиль программирования, и любой, кто делает это, заслуживает перерыва в работе сценария. ;)
  • У вас есть условие, которое зависит от некоторой другой переменной, которая может изменяться в цикле, например for ($i = 0; $i -lt $j; $i++), где $j может меняться в цикле.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...