Подтвердить что ты не робот

Powershell показывает прошедшее время

У меня есть script, который запускает событие и ждет, чтобы пользователь нажал любую клавишу, чтобы остановить выполнение script. Я пытался найти способ показать таймер (как долго работает script), ожидая ввода пользователя в 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;
    }
}
4b9b3361

Ответ 1

Из статьи Измерение прошедшего времени в Powershell (архивная копия):

Предполагая, что переменная $script:StartTime была установлена ​​на начало вашего script, прошедшее время можно определить, используя из следующих методов:

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

или

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

Оба метода работают точно так же и создают объект System.TimeSpan.

Итак, используя приведенный выше пример, вы можете установить $script:StartTime перед Read-Host, а затем вызвать   $elapsedTime = $(get-date) - $script:StartTime после.

Ответ 2

Эта статья дала мне правильную идею:

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

Однако использование класса таймера дало мне что-то вроде этого:

$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 и т.д.). Дайте мне знать, если это поможет.

Приветствия,

Ответ 3

Я доволен этой маленькой функцией, расширенной от ответа 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} 
}

Ответ 4

это дало мне результат я после:)

$StartTime = $(get-date)

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

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