2012-06-08 38 views
13

Tôi có tập lệnh khởi chạy sự kiện và đợi người dùng nhấn bất kỳ phím nào để dừng thực thi tập lệnh. Tôi đã cố gắng tìm một cách để hiển thị một bộ đếm thời gian (bao lâu kịch bản đã được chạy) trong khi chờ đợi cho người dùng đầu vào tại Read-Host. Có cách nào để thực hiện điều này?Powershell hiển thị thời gian đã trôi qua

Chỉnh sửa: Cảm ơn tất cả các đầu vào. Này hoạt động

$Time = [System.Diagnostics.Stopwatch]::StartNew() 
while ($true) { 
    $CurrentTime = $Time.Elapsed 
    write-host $([string]::Format("`rTime: {0:d2}:{1:d2}:{2:d2}", 
     $CurrentTime.hours, 
     $CurrentTime.minutes, 
     $CurrentTime.seconds)) -nonewline 
    sleep 1 
    if ($Host.UI.RawUI.KeyAvailable -and ("q" -eq $Host.UI.RawUI.ReadKey("IncludeKeyUp,NoEcho").Character)) { 
     Write-Host "Exiting now" 
     break; 
    } 
} 
+0

Hãy xem ở đây để sử dụng giao diện người dùng WPF trong backgound trong powershell http://www.nivot.org/blog/post/2008/05/23/BackgroundTimerPowerShellWPFWidget –

Trả lời

13

Từ bài viết Measuring Elapsed Time in Powershell (archived copy):

Giả sử rằng biến $script:StartTime được đặt ở đầu kịch bản của bạn, thời gian trôi qua có thể được xác định bằng cách sử dụng các phương pháp sau :

$elapsedTime = new-timespan $script:StartTime $(get-date)

hoặc

$elapsedTime = $(get-date) - $script:StartTime

Cả hai phương pháp làm việc giống hệt nhau và tạo ra một đối tượng System.TimeSpan.

Vì vậy, sử dụng các ví dụ trên, bạn có thể thiết $script:StartTime trước Read-Host và sau đó gọi $elapsedTime = $(get-date) - $script:StartTime sau.

+0

Phải, tôi hiểu rất nhiều, nhưng tôi muốn xem liệu nó có thể hiển thị hay không một đồng hồ đang chạy trong khi đợi tại lời nhắc Read-Host. – Jeff

4

Bài viết này đã cho tôi ý tưởng đúng:

http://poshtips.com/2010/03/29/powershell-countdown-timer/

Tuy nhiên, sử dụng lớp hẹn giờ đã cho tôi một cái gì đó như thế này:

$Time = [System.Diagnostics.Stopwatch]::StartNew() 
while ($NoEvent) { 
    $CurrentTime = $Time.Elapsed 
    write-host $([string]::Format("`rTime: {0:d2}:{1:d2}:{2:d2}", 
     $CurrentTime.hours, 
     $CurrentTime.minutes, 
     $CurrentTime.seconds)) -nonewline 
    sleep 1 

    #Handle event 
    if(event){$NoEvent = false} 
} 

đâu $ NoEvent là sự kiện của bạn/boolean (key nhấn func, v.v.) Hãy cho tôi biết nếu điều này sẽ giúp.

Chúc mừng,

+1

diagnostics.stopwatch là lỗi, fwiw – cmcginty

0

Tôi hài lòng với chức năng này ít mở rộng trên từ câu trả lời của Xelco52

$startTime = $(get-date) 
write-host "Elapsed:00:00:00" 
$NoEvent = $true 
While ($NoEvent) 
{ 
    Start-Sleep 1 
    $elapsedTime = new-timespan $startTime $(get-date) 
    write-host "Elapsed:$($elapsedTime.ToString("hh\:mm\:ss"))" 

    #Handle event 
    if(event){$NoEvent = $false} 
} 
-1

này đã cho tôi ra tôi đã được sau :)

$StartTime = $(get-date) 

$elapsedTime = $(get-date) - $StartTime 

$totalTime = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks) 
Các vấn đề liên quan