2008-09-29 10 views
15

Szukałem, ale najwyraźniej moje google foo jest słabe. Potrzebuję sposobu, aby poprosić użytkownika o dane wejściowe w konsoli i mieć czas oczekiwania po pewnym czasie i kontynuować wykonywanie skryptu, jeśli nie wejdzie żadne wejście. Tak blisko, jak mogę powiedzieć, Read-Host nie zapewnia tego funkcjonalność. Ani $ host.UI.PromptForChoice(), ani $ host.UI.RawUI.ReadKey(). Z góry dziękuję za wszelkie wskazówki.Oczekiwanie na podanie przez użytkownika z przekroczeniem limitu czasu

EDYCJA: Dziękuję Larsowi Truijensowi za znalezienie odpowiedzi. Wziąłem kod, który wskazał i umieścił go w funkcji. Zauważ, że sposób, w jaki go zaimplementowałem, oznacza, że ​​może upłynąć do jednej sekundy opóźnienia między momentem, w którym użytkownik uderzy w klucz, a uruchomieniem skryptu.

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

Odpowiedz

15

znalazł coś here:

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

Dziękuję bardzo. Kłaniam się przed waszym potężnym google fu. – EBGreen

+3

W PowerShell 2 znajduje się także polecenie cmdlet 'Start-Sleep'. – Joey

4

Jest to dość stary, ale teraz jak mam rozwiązać go na podstawie tego samego sposobu KeyAvailable jest tutaj:

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

To czeka na x sekund , wyświetlając . na każdą sekundę, która upływa do maksymalnego czasu oczekiwania. Jeśli klawisz zostanie naciśnięty, zwróci $true, w przeciwnym razie $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; 
} 

I używać:

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

Problem z powyższym oznacza, że ​​żadne naciśnięcie klawisza nie jest "połknięte". Aby go połknąć, możesz umieścić następujące elementy przed ostatecznym zwrotem: '$ host.UI.RawUI.ReadKey (" NoEcho, IncludeKeyDown ")' –

Powiązane problemy