0

有时我的 prg 以相当高的 cpu 时间消耗运行。
之后,尽管我进行了同步,但 pc-clock 可能会相差 10 秒。电脑时钟与互联网时间每天两次。

现在我想同步。如果时间相差超过(例如)2 秒,则为 pc-clock。我想使用:

     PS C:\Windows\system32> w32tm /stripchart /computer:us.pool.ntp.org /dataonly /samples:5
     Tracking us.pool.ntp.org [50.7.72.4:123].
     Collecting 5 samples.
     The current time is 08.08.2014 08:35:44.
     08:35:44, -00.1019929s
     08:35:47, -00.1082726s
     08:35:49, -00.1077418s
     08:35:51, -00.1082350s
     08:35:53, -00.1007278s

我的问题是我的 powershell 脚本如何接收来自 w32tm 的时差?然后我当然可以检查差异并执行以下操作:

     start-process w32tm /resync 

控制台出现一毫秒,但可以肯定的是,重新同步必须失败,因为我还没有以管理员身份启动 w32tm - 这会导致访问不允许错误。

提前致谢!

鬼鬼祟祟的我喜欢这个解决方案 - 非常简单:

      $x = w32tm /stripchart /computer:us.pool.ntp.org /dataonly /samples:5 | Out-String
      $x

因为我现在无法在这里回答我自己的问题,所以我的解决方案。
偶尔高 cpu 使用率会导致 pc-clock 运行得太快,我有时间敏感的程序需要知道确切的时间。
另一方面,我无法定义 Win 7 时间同步的确切时间戳(仅每 x 秒),这可能会在我不想要的时候导致时间更改。
所以我编写了这个解决方案,这对我来说很好,但可以改进为
1)检查和同步的时间。是硬编码的:总是在 Min 12 或 42 和 Sec。27 和
2)它必须以管理员身份运行,否则时间同步失败,错误 0x80070005 => 访问被拒绝。

无论如何,对于那些可能感兴趣的人:

        # http://technet.microsoft.com/en-us/library/cc773263%28v=ws.10%29.aspx
        function chkSync { param([bool]$sync=$true)
            $x = w32tm /stripchart /computer:ptbtime2.ptb.de /dataonly /samples:5 | Out-String
            $y = $x.Split("`n")
            $c = 0
            $n = 0
            foreach( $a in $y ) {
                $z = $a.Split(",")
                if ( $z[1] -match '([\d\.\-\+]+)' ){
                    $b = [double]$matches[1]
                    $c += $b; $n++
                }
            }
            if ( $n -gt 0 ) {
                $d = $c/$n
            } else { $d = 0 }

            if ( $sync -and $d*$d -gt 1.0 ) { # instead of [Math]::Abs 
                Write-Host (get-date).ToString('HH:mm:ss') "bef. sync.:" $d.ToString('f3') "start sync. now"
                $s = w32tm /resync | Out-String
                Write-Host $s # Error 0x80070005 => access denied: run as adimnistartor!!
                chkSync $false
            } else {
                # every 30 min at 12:47 -or 42:47
                $slp = [int]$(1800 + 747 - ((((get-date).Minute)%30)*60 + $((get-date).Second)))
                Write-Host (get-date).ToString('HH:mm:ss') "avg. delay:" $d.ToString('f3')` 
                           "next check:" $($(get-date).AddSeconds($slp)).ToString('HH:mm:ss')
            }
            Start-Sleep -s $slp
        }

        do { chkSync } while ( $true )
4

0 回答 0