2008-09-29 10 views
15

J'ai cherché mais apparemment mon google foo est faible. Ce dont j'ai besoin, c'est d'un moyen d'inviter l'utilisateur à entrer dans la console et d'attendre la fin de la requête et de continuer à exécuter le script si aucune entrée ne vient. Aussi proche que je puisse dire, Read-Host ne fournit pas fonctionnalité. Ni $ host.UI.PromptForChoice() ni $ host.UI.RawUI.ReadKey(). Merci d'avance pour les pointeurs.En attente de la saisie par l'utilisateur avec un délai

EDIT: Un grand merci à Lars Truijens pour avoir trouvé la réponse. J'ai pris le code qu'il a indiqué et l'ai encapsulé dans une fonction. Notez que la façon dont je l'ai implémenté signifie qu'il peut y avoir jusqu'à une seconde de délai entre le moment où l'utilisateur frappe une clé et celui où l'exécution du script se poursuit.

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

Répondre

15

trouvé quelque chose here:

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

Merci beaucoup. Je m'incline devant ton puissant google fu. – EBGreen

+3

Dans PowerShell 2, il existe également la cmdlet 'Start-Sleep'. – Joey

4

Il est assez vieux maintenant, mais comment je l'ai résolu basé sur la même méthode KeyAvailable est ici:

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

Il attend x secondes , affichant . pour chaque seconde qui s'écoule jusqu'au temps d'attente maximum. Si une touche est pressée, elle renvoie $true, sinon $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; 
} 

Et à utiliser:

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

Un problème avec ce qui précède est que n'importe quelle touche n'est pas "avalée". Pour l'avaler, vous pouvez mettre ce qui suit avant le retour final: '$ host.UI.RawUI.ReadKey (" NoEcho, IncludeKeyDown ")' –

Questions connexes