有时我的 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 )