更新/重新启动后Windows Server时间不正确

时间:2017-06-30 03:44:04

标签: windows batch-file time server windows-server-2012

我们正在运行Windows Server 2012 R2。我发现当服务器安装更新并重新启动时(每天凌晨4点),它将在不正确的时区重新启动。我们的时间大小为EST -5(目前为夏令时为-4),服务器默认为UTC -0,比我们的时区提前4小时。

当我们最初发现此问题时,我们发现实际工作的唯一解决方法是在服务器重新启动时使用任务计划程序运行同步命令。直到两周前,大约在2017年6月15日左右,这项任务和命令运作良好,从那时起它就没有用了。我已经查看了任务/事件日志,它声称已成功运行,但它没有。

我唯一想到的是,Windows更新中存在一些使同步代码无效的内容。但我不知道那可能是什么。有没有人有关于如何识别问题的建议?

我们使用的同步代码位于.bat文件中。在6/14上午安装的两个Windows更新,我怀疑这可能是任务不再起作用的原因,是:

2017-06用于基于x64的系统的Windows Server 2012 R2安全月度质量汇总(KB4022726)

适用于Windows 8,8.1,10和Windows Server 2012,2012 R2,2016 x64 Edition的Windows恶意软件删除工具 - 2017年6月(KB890830)

REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0

:SyncStart
if %retryCount == 90 goto SyncEnd
set /A retryCount=retryCount + 1

REM *** Resync the system clock
net start w32time
w32tm /resync
if errorlevel 1 goto SyncDelay
if errorlevel 0 goto SyncEnd

:SyncDelay
REM *** If unsuccessful, delay 10 seconds, then retry
choice /n /t:y,10>nul
goto SyncStart

:SyncEnd

1 个答案:

答案 0 :(得分:1)

批处理文件包含一行语法错误:

if %retryCount == 90 goto SyncEnd

使用标准扩展时,必须使用%VariableName%引用环境变量的值,而不仅仅是%VariableName,例如 FOR 循环变量(cmd上的%I分别在批处理文件中%%I或批处理文件参数(%0%1,...)或!VariableName!使用延迟扩展,这里不需要

代码也可以优化:

@echo off
REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0

:SyncStart
if %retryCount% == 90 goto :EOF
set /A retryCount+=1

REM *** Resync the system clock
%SystemRoot%\System32\net.exe start w32time
%SystemRoot%\System32\w32tm.exe /resync
if not errorlevel 1 goto :EOF

REM *** If unsuccessful, delay 10 seconds, then retry
%SystemRoot%\System32\timeout.exe 10 /nobreak
goto SyncStart

嗯,代码可以进一步优化:

@echo off
REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0
%SystemRoot%\System32\net.exe start w32time
%SystemRoot%\System32\timeout.exe 5 /nobreak

:SyncTime
%SystemRoot%\System32\w32tm.exe /resync
if not errorlevel 1 goto :EOF

REM *** If unsuccessful, delay 10 seconds, then retry
set /A retryCount+=1
if not %retryCount% == 90 %SystemRoot%\System32\timeout.exe 10 /nobreak & goto SyncTime

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • goto /?
  • if /?
  • net /?
  • net start /?
  • rem /?
  • set /?
  • timeout /?
  • w32tm /?

阅读Microsoft支持文章Testing for a Specific Error Level in Batch Files