PowerShell显示已用时间

时间:2012-06-08 00:38:56

标签: powershell timer

我有一个脚本启动一个事件并等待用户按任意键来停止脚本执行。我在Read-Host等待用户输入时试图找到一种显示计时器(脚本运行了多长时间)的方法。有没有办法实现这个目标?


这有效

$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;
    }
}

4 个答案:

答案 0 :(得分:15)

来自文章Measuring Elapsed Time in Powershellarchived copy):

  

假设变量$script:StartTime设置为   脚本的开头,可以使用其中任何一个确定经过的时间   以下方法:

     

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

     

     

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

     

两种方法的工作方式完全相同,并生成System.TimeSpan个对象。

因此,使用上面的示例,您可以在Read-Host之前设置$script:StartTime然后调用  $elapsedTime = $(get-date) - $script:StartTime之后。

答案 1 :(得分:6)

使用计时器类(RIP poshtips)给了我这样的东西:

$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}
}

$ NoEvent是你的事件/布尔值(键按func等)。

答案 2 :(得分:6)

这给了我以后的输出:)

$StartTime = $(get-date)

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

$totalTime = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)

答案 3 :(得分:0)

我很高兴从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} 
}