2012-03-29 7 views
0

Ich habe folgende Powershell-Schleife:Powershell - der Suche nach Äquivalent von Perl Redo

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 
     } 
    } 
} 

Wenn Powershell trifft die „Weiter“, geht es weiter nach oben der for Schleife und geht zum nächsten Farbe.

In Perl, Sie haben last (äquivalent zu Powershell break) und Sie haben next (äquivalent zu Powershell continue). Sie haben auch die redo, die an den Anfang der Schleife zurückgeht, aber den for Schleifenzähler nicht erhöht.

Gibt es einen entsprechenden Powershell-Befehl für die redo-Funktion von Perl für die for-Schleife?

Ich kann die Anweisung in eine while Schleife leicht umwandeln, um dieses spezielle Problem zu umgehen, aber ich fragte mich, ob es etwas wie redo irgendwie gibt.

+0

AFAIK, die meisten Sprachen haben kein Äquivalent "Redo". – kirilloid

+0

@kirilloid Ich weiß, aber es ist schön in Fällen wie diesem. Changed es in eine 'while' Schleife. Das erste Mal, dass ich PowerShell benutzt habe. –

Antwort

1

Ich bin mir ziemlich sicher, PowerShell unterstützt nicht, was Sie suchen. Sie können Break- und Continue-Anweisungen beschriftet haben, aber keiner führt Sie an die Spitze der innerhalb des zugehörigen Loop/Switch-Konstrukts. Wenn PowerShell eine GoTo-Anweisung hätte, wäre ich festgelegt, aber ich bin froh, dass es dieses Schlüsselwort nicht hat. :-) Weitere Informationen zum markierten Break/Continue finden Sie im Hilfethema about_break.

+0

Ich änderte die Schleife in eine 'while' Schleife und setzte das Inkrement in die 'Else'-Klausel.Das hat getan was ich will (Test nach dem Schlaf). Normalerweise mache ich Skripte in Python oder Perl. Dies ist jedoch ein PC-Shop und ich kann keines von beiden auf diesem System installieren. Es hat PowerShell, also war das meine Entscheidung. Habe es noch nie zuvor benutzt. –

+0

Angesichts Ihres Hintergrundes, denke ich, dass Sie es mögen werden, besonders in Anbetracht der Alternative: Batch-Dateien. :-) –

+0

Oder VBSscript! Mächtiges mächtiges VBScript! ... Schlechtes VBScript lol –

0

Ein Äquivalent Perl Redo wäre schön, und ich hoffe, dass sie es in einer zukünftigen Version einführen, sondern vor allem, weil es nützlich wäre, in Foreach-Object, foreach und während Schleifen.

jedoch in einer für Schleife zumindest eine typischen, können Sie ganz einfach die Funktionalität reproduzieren, indem einfach die Inkrementierung sofort umgekehrt, bevor die Anweisung fortzusetzen.

In diesem Fall, da der Zuwachs Anweisung (aka <repeat> in der Dokumentation Powershell) ist $color++, nur Stick $color-- unmittelbar vor continue. Aus Gründen der Klarheit/Eleganz, würde ich sie auf einer Linie, um es deutlicher, dass es im Wesentlichen eine einzige Regel contsruct schlägt vor,:

$color--; continue 

Die einzigen Gründe, warum ich von denken kann, warum das wäre überhaupt nicht:

  • Sie manipulieren sonst die Schleifenvariable innerhalb der Schleife. Aber ich denke, das ist ein schrecklicher Programmierstil und jeder, der das macht, verdient es, dass sein Skript kaputt geht. ;)
  • Sie haben eine Bedingung, die von einer anderen Variablen abhängt, die sich innerhalb der Schleife ändern kann, z. for ($i = 0; $i -lt $j; $i++) wobei $j innerhalb der Schleife ändern kann.
+0

Interessante Idee, aber ich mag es nicht. Sie sollten den Wert des Inkremators der For-Schleife nicht ändern. Das kann schlampige Programmierung hinterlassen. Entwickler erwarten die Unverletzlichkeit des 'for'-Incrementors. Das "Redo" kommt um, weil es den Wert überhaupt nicht modifiziert. Es verhindert lediglich, dass es sich ändert, wenn die Schleife erneut ausgeführt wird. Die Anweisungen "break/continue/last/next/redo" sind nicht das gefürchtete 'goto', weil sie alle an denselben Ort zurückkehren. Sie sind Abkürzungen, die helfen, die Logik zu verdeutlichen. –