28

我有一个脚本启动一个事件并等待用户按任意键来停止脚本执行。我试图找到一种方法来显示计时器(脚本运行了多长时间),同时在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

4 回答 4

28

这给了我想要的输出:)

$StartTime = $(get-date)

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

$totalTime = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
于 2017-07-11T10:02:05.690 回答
19

来自文章在 Powershell 中测量经过的时间存档副本):

假设变量$script:StartTime是在脚本开头设置的,则可以使用以下任一方法确定经过的时间:

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

或者

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

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

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

于 2012-06-08T00:44:19.227 回答
7

使用计时器类(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 是您的事件/布尔值(按键功能等)。

于 2012-06-08T13:28:41.327 回答
4

我对从 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} 
}
于 2017-06-28T04:08:37.883 回答