25

検索しましたが、どうやら私のGoogle fooが弱いようです。私が必要としているのは、コンソールでユーザー入力を求め、一定時間後にリクエストをタイムアウトさせ、入力がない場合はスクリプトの実行を続行する方法です。私が知る限り、Read-Host はこれを提供しません。機能。$host.UI.PromptForChoice() も $host.UI.RawUI.ReadKey() も行いません。ご指摘ありがとうございます。

編集:答えを見つけてくれたLars Truijensに感謝します。彼が指摘したコードを関数にカプセル化しました。私が実装した方法では、ユーザーがキーを押してからスクリプトの実行が続くまでに最大 1 秒の遅延が生じる可能性があることに注意してください。

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

7 に答える 7

19

ここで何かを見つけました:

$counter = 0
while(!$Host.UI.RawUI.KeyAvailable -and ($counter++ -lt 600))
{
      [Threading.Thread]::Sleep( 1000 )
}
于 2008-09-29T19:44:47.937 に答える
6

今ではかなり古いですが、同じ KeyAvailable メソッドに基づいて解決した方法は次のとおりです。

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

x 秒間待機.し、最大待機時間までの経過時間を 1 秒ごとに表示します。キーが押された場合は戻り$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
于 2015-03-30T10:00:48.633 に答える