2008-09-29 134 views
15

我已經搜索,但顯然我的谷歌foo很弱。我需要的是一種在控制檯中提示用戶輸入並在一段時間後請求超時的方式,如果沒有輸入,請繼續執行腳本。盡我所知,Read-Host不提供此功能功能。 $ host.UI.PromptForChoice()也不是$ host.UI.RawUI.ReadKey()。提前感謝任何指針。等待超時的用戶輸入

編輯:非常感謝Lars Truijens尋找答案。我已經拿出他指出的代碼並將其封裝到一個函數中。請注意,我實現它的方式意味着在用戶點擊某個鍵和繼續執行腳本之間可能會有一秒的延遲。

function Pause-Host 
{ 
    param(
      $Delay = 1 
     ) 
    $counter = 0; 
    While(!$host.UI.RawUI.KeyAvailable -and ($counter++ -lt $Delay)) 
    { 
     [Threading.Thread]::Sleep(1000) 
    } 
} 

回答

15

找到東西here

$counter = 0 
while(!$Host.UI.RawUI.KeyAvailable -and ($counter++ -lt 600)) 
{ 
     [Threading.Thread]::Sleep(1000) 
} 
+1

非常感謝你。我在你強大的谷歌之前鞠躬。 – EBGreen 2008-09-29 19:50:35

+3

在PowerShell 2中,還有`Start-Sleep` cmdlet。 – Joey 2011-04-06 16:27:15

4

現在是很老,但我如何解決它基於同樣的KeyAvailable方法是在這裏:

https://gist.github.com/nathanchere/704920a4a43f06f4f0d2

它等待x秒,每秒顯示一個.,經過最長等待時間。如果按下某個鍵,則返回$true,否則返回$false

Function TimedPrompt($prompt,$secondsToWait){ 
    Write-Host -NoNewline $prompt 
    $secondsCounter = 0 
    $subCounter = 0 
    While ((!$host.ui.rawui.KeyAvailable) -and ($count -lt $secondsToWait)){ 
     start-sleep -m 10 
     $subCounter = $subCounter + 10 
     if($subCounter -eq 1000) 
     { 
      $secondsCounter++ 
      $subCounter = 0 
      Write-Host -NoNewline "." 
     }  
     If ($secondsCounter -eq $secondsToWait) { 
      Write-Host "`r`n" 
      return $false; 
     } 
    } 
    Write-Host "`r`n" 
    return $true; 
} 

,並使用:

$val = TimedPrompt "Press key to cancel restore; will begin in 3 seconds" 3 
Write-Host $val