2008-09-29 49 views
15

Tôi đã tìm kiếm nhưng dường như foo google của tôi yếu. Những gì tôi cần là một cách để nhắc nhở người dùng nhập vào trong giao diện điều khiển và yêu cầu thời gian chờ sau một khoảng thời gian và tiếp tục thực thi tập lệnh nếu không có đầu vào nào. Như tôi có thể nói, Read-Host không cung cấp chức năng. $ Host.UI.PromptForChoice() cũng không phải $ host.UI.RawUI.ReadKey(). Cảm ơn trước cho bất kỳ con trỏ.Đang chờ người dùng nhập vào với thời gian chờ

EDIT: Rất cảm ơn Lars Truijens vì đã tìm câu trả lời. Tôi đã lấy mã mà ông đã chỉ ra và gói gọn nó vào một chức năng. Lưu ý rằng cách mà tôi đã thực hiện nó có nghĩa là có thể có đến một giây chậm trễ giữa thời điểm người dùng nhấn một phím và khi thực thi tập lệnh tiếp tục.

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

Trả lời

15

Tìm thấy một cái gì đó here:

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

Thank you very much. Tôi cúi xuống trước khi anh hùng mạnh mẽ của bạn. – EBGreen

+3

Trong PowerShell 2 cũng có lệnh ghép ngắn 'Start-Sleep'. – Joey

4

Đó là khá cũ bây giờ nhưng làm thế nào tôi giải quyết nó dựa trên phương pháp KeyAvailable cùng là ở đây:

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

Nó chờ x giây , hiển thị một . cho mỗi giây trôi qua đến thời gian chờ tối đa. Nếu một phím được nhấn, nó trả về $true, nếu không $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; 
} 

Và để sử dụng:

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

Một vấn đề ở trên là bất kỳ phím bấm nào không bị 'nuốt'. Để nuốt nó, bạn có thể đặt như sau trước khi trở về cuối cùng: '$ host.UI.RawUI.ReadKey (" NoEcho, IncludeKeyDown ")' –

Các vấn đề liên quan