首页 > 解决方案 > 有没有办法从预定时间使用 Powershell 秒表作为计数器?

问题描述

我一直在寻找一种方法来使用 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
}

标签: powershelltimercountcounter

解决方案


这是完成工作的另一种方法。[咧嘴笑]它做了什么...

  • 用于[datetime]::Now获取当前时间,
    这明显比Get-Date.
  • 将代码捆绑到具有标准名称格式的函数中
  • 使用foreach而不是for
    第一个比第二个更快,因为它执行一次测试,然后简单地迭代结果范围,而不是测试每次通过。
  • 使用直接日期时间数学而不是较慢的New-TimeSpan.

  • 从您的代码为您提供负时间间隔的当前时间中减去开始时间。我想你真的想要“多久了?” 而不是“开始日期过去多长时间?”。
  • 使用Start-Sleepcmdlet的全名
    最好使用任何 cmdlet/函数/参数的全名,以便您拥有易于扫描的代码。

这是代码...

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

推荐阅读