2012-03-29 35 views
0

我有以下的PowerShell循環:PowerShell的 - 尋找Perl的重做相當於

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這樣的東西。

+0

AFAIK,大多數語言沒有'重做'等效。 – kirilloid 2012-03-29 19:34:14

+0

@kirilloid我知道,但在這種情況下很好。將其更改爲「while」循環。我第一次使用PowerShell。 – 2012-03-29 22:00:54

回答

1

我很確定PowerShell不支持你要找的東西。您可以標記爲中斷和繼續語句,但都不會將您帶到相關環路/交換機結構的內的的頂部。如果PowerShell有一個goto表達式,你會被設置,但我很高興它沒有這個關鍵字。 :-)有關標記爲break/continue的更多信息,請參閱about_break幫助主題。

+0

我將循環更改爲'while'循環,並將增量放在'Else'子句中。這就是我想要的(睡眠後重新測試)。我通常在Python或Perl中執行腳本。但是,這是一家PC商店,我無法在這個系統上安裝其中的任何一個。它有PowerShell,所以這是我的選擇。以前從未使用過。 – 2012-03-29 21:59:58

+0

鑑於你的背景,我認爲你會喜歡它,尤其是考慮到批處理文件。 :-) – 2012-03-29 22:32:30

+0

或VBSscript! Mighty mighty VBScript!... VBscript lol – 2012-03-30 03:19:10

0

Perl的的等效重做將是很好的,我希望他們在未來的版本中引入的,但主要是因爲它會在的foreach對象的foreach,並循環很有用。

然而,在循環,至少一個典型的一個,你可以通過簡單地立即扭轉增量前繼續聲明再現功能。

在這種情況下,由於增量語句(PowerShell的文檔中又名<repeat>)是​​3210,只是continue之前堅持$color--馬上。爲了清楚起見/優雅,我建議把他們在一行,使其更清晰,它本質上是一個單迴路控制contsruct:

$color--; continue 

我能想到的爲什麼會永遠行不通的唯一原因:

  • 你在其他方面操縱循環內的循環變量。但我認爲這是糟糕的編程風格,任何正在做這件事的人都應該讓他們的腳本中斷。 ;)
  • 您有一個條件取決於可以在循環中更改的其他變量,例如, for ($i = 0; $i -lt $j; $i++)其中$j可以在循環內改變。
+0

有趣的想法,但我不喜歡。你不應該改變'for'循環的增量的值。這可以留給馬虎編程。開發人員期望'for'增量器的不可侵犯性。 'redo'解決了這個問題,因爲它根本不修改*值。它只是防止它在循環被重新執行時改變。 'break/continue/last/next/redo'語句並不是可怕的'goto',因爲它們都返回到同一個地方。它們是有助於澄清邏輯的捷徑。 – 2016-09-16 12:45:57