2008-09-29 19 views
15

He buscado pero aparentemente mi google foo es débil. Lo que necesito es una forma de solicitar la entrada del usuario en la consola y dejar que la solicitud se agote después de un período de tiempo y continúe ejecutando el script si no entra ninguna entrada. Por lo que puedo decir, Read-Host no proporciona esto. funcionalidad. Ni $ host.UI.PromptForChoice() ni $ host.UI.RawUI.ReadKey(). De antemano, gracias por cualquier consejo.Esperando la entrada del usuario con un tiempo de espera

EDITAR: Muchas gracias a Lars Truijens por encontrar la respuesta. Tomé el código que él señaló y lo encapsulé en una función. Tenga en cuenta que la forma en que lo he implementado significa que podría haber hasta un segundo de retraso entre el momento en que el usuario toca una tecla y la ejecución del script.

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

Respuesta

15

encontrado algo here:

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

Muchas gracias. Me inclino ante tu poderoso google fu. – EBGreen

+3

En PowerShell 2 también está el cmdlet 'Start-Sleep'. – Joey

4

Es bastante viejo ahora, pero cómo lo resolví basado en el mismo método KeyAvailable está aquí:

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

Se espera x segundos , mostrando un . por cada segundo que transcurra hasta el tiempo máximo de espera. Si se presiona una tecla, devuelve $true, de lo contrario $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; 
} 

y de utilizar:

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

Un problema con lo anterior es que cualquier pulsación de tecla no se 'traga'. Para tragarlo, puede poner lo siguiente antes de la devolución final: '$ host.UI.RawUI.ReadKey (" NoEcho, IncludeKeyDown ")' –

Cuestiones relacionadas