Есть ли способ использовать секундомер Powershell в качестве счетчика с заданного времени? - PullRequest
0 голосов
/ 05 ноября 2019

Я искал века, чтобы найти способ создания секундного таймера / счетчика, используя powershell, но используя историческую дату / время, с которого нужно начинать.

Все примеры, которые я нашелиспользовали секундомер (отлично), но, похоже, он не работает с предварительно загруженной датой / временем. Только текущее время.

После извлечения идей из нескольких мест я получил рабочий сценарий, но мне было интересно узнать, есть ли лучший способ сделать это?

write-host "Started at $(get-date)"

for ($t=1; $t -le 300; $t++) {
$date = Get-Date
$datediff =(NEW-TIMESPAN -Start $StartDate -End $date).ToString()
$datediff | OUT-FILE "C:\Temp\ChronoDiff.txt"
    sleep 1
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

вот альтернативный способ добиться цели. [ ухмыляется ] что он делает ...

  • использует [datetime]::Now для получения текущего времени
    это заметно быстрее, чем Get-Date.
  • связывает код в функцию со стандартным форматом имени
  • использует foreach вместо for
    , 1-й быстрее, чем 2-й, так как он выполняет тест ОДИН РАЗ, а затемпросто повторяет полученный диапазон вместо проверки каждого прохода.
  • использует прямую математику даты и времени вместо более медленной New-TimeSpan.
  • вычитает время начала из текущего времени
    ваш код дает вам отрицательные интервалы времени. я полагаю, вы действительно хотите "как долго это было?"вместо «как далеко в прошлом дата начала?».
  • использует полное имя командлета Start-Sleep
    . Хорошо использовать полное имя любого командлета / функции / параметра, чтобы иметь простой для сканирования код.

вот код ...

function Get-TimerSeconds
    {
    [CmdletBinding()]
    Param (
        [datetime]
        $StartDate = [datetime]::Now,

        [int]
        $TotalSeconds = 10
        )

    begin {}

    process
        {
        foreach ($Second in 1..$TotalSeconds)
            {
            ([datetime]::Now - $StartDate).ToString()
            Start-Sleep -Seconds 1
            }
        }

    end {}

    }

усеченный вывод с Get-TimerSeconds ...

00:00:00
00:00:01.0170000
...
00:00:08.1150000
00:00:09.1290000

усеченный вывод с Get-TimerInfo -StartDate '2019-11-01 21:31:41' -TotalSeconds 15 .. .

3.13:23:06.4170000
3.13:23:07.4320000
...
3.13:23:19.6000000
3.13:23:20.6150000
0 голосов
/ 05 ноября 2019

Это хорошее решение.
И если вы ищете что-то наподобие функции StopWatch со свойством input (указанную вами дату / время начала), вставьте свой код в функцию с именем StopWatch.

    function StopWatch ([datetime]$StartDate) {
        do {
            write-host "$((New-TimeSpan $StartDate (get-date)).tostring())`r" -NoNewline
            sleep 1
        } while ($true)
    }

    C:\PS>StopWatch 1.1.2019
    C:\PS>StopWatch '1.1.2019 12:20'
...