2008-09-29 24 views
15

मैंने खोज की है लेकिन स्पष्ट रूप से मेरा Google foo कमजोर है। मुझे जो चाहिए वह कंसोल में उपयोगकर्ता इनपुट के लिए संकेत देने का एक तरीका है और समय के बाद अनुरोध का समय समाप्त हो गया है और यदि कोई इनपुट नहीं आता है तो स्क्रिप्ट निष्पादित करना जारी रखें। जैसा कि मैं कह सकता हूं, रीड-होस्ट यह प्रदान नहीं करता है कार्यक्षमता। न तो $ host.UI.PromptForChoice() और न ही $ host.UI.RawUI.ReadKey() करता है। किसी भी पॉइंटर्स के लिए अग्रिम धन्यवाद।एक समय समाप्ति के साथ उपयोगकर्ता इनपुट की प्रतीक्षा

संपादित करें: उत्तर खोजने के लिए लार्स Truijens के लिए बहुत धन्यवाद। मैंने वह कोड लिया है जिसे उसने इंगित किया और इसे एक समारोह में encapsulated। ध्यान दें कि जिस तरीके से मैंने इसे कार्यान्वित किया है, इसका मतलब है कि जब उपयोगकर्ता कुंजी को हिट करता है और जब स्क्रिप्ट निष्पादन जारी रहता है तो बीच में एक सेकंड की देरी हो सकती है।

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

उत्तर

15

मिले कुछ here:

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

आपको बहुत बहुत धन्यवाद। मैं अपने शक्तिशाली गूगल फू से पहले झुकता हूँ। – EBGreen

+3

पावरशेल 2 में 'स्टार्ट-स्लीप' cmdlet भी है। – Joey

4

अब यह काफी पुराना है, लेकिन मैं कैसे हल एक ही KeyAvailable पद्धति पर आधारित यह यहाँ है:

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

यह एक्स सेकंड के लिए इंतजार कर रहा है , प्रत्येक प्रतीक्षा के लिए . प्रदर्शित करता है जो अधिकतम प्रतीक्षा समय तक समाप्त हो जाता है। यदि एक कुंजी दबाया जाता है तो यह $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 
+0

उपरोक्त के साथ एक मुद्दा यह है कि कोई भी कुंजीपटल 'निगल' नहीं है। इसे निगलने के लिए आप अंतिम वापसी से पहले निम्नलिखित डाल सकते हैं: '$ host.UI.RawUI.ReadKey (" NoEcho, IncludeKeyDown ")' –

संबंधित मुद्दे