使用windows CMD 時間自動校正

[預設的時間校時]
winodws 在「控制台」->「日期和時間」->「網際網路時間」->「變更設定」裡面的「與網際網路時間伺服器同步處理」,可以按「立即更新」來校正時間。
但是這邊沒辦法設定多久自動校時一次,而且內建的時間伺服器(例如time.windows.com)如果校正失敗,也沒辦法在這裡手動新增其他時間伺服器。

[新增預設的時間校時伺服器下拉選單內容]
如果要修改上述的時間伺服器下拉選單。
可執行 regedit 編輯系統登錄檔,在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers] 裡面可以新增修改可用的時間伺服器下拉選單。

[設定多久校時一次:NTPClock、Windows Time(W32Time)]
如果要設定多久自動校時一次,可以下載國家時間與頻率標準實驗室的 NTPClock 校時程式。
或是用系統內建的 Windows Time(W32Time) 服務來設定。
以下介紹 Windows Time(W32Time) 。

[啟動 W32Time]
先使用 w32tm /query /peers 看目前 W32Time 的時間伺服器有哪些,如果顯示服務尚未啟動。則先到「服務」中,將 Windows Time 啟動,並將啟動類型設定為「自動(延遲開始)」(沒設定延遲開始,重開機似乎會無法啟動)。

C:\Windows\system32>w32tm /query /peers
發生下列錯誤: 服務尚未啟動。 (0x80070426)

如果有正常啟動,執行 w32tm /query /peers 就可看到目前的時間伺服器設定(這邊的伺服器清單跟「網際網路時間」那邊的下拉清單不同)

C:\Windows\system32>w32tm /query /peers
#對等: 1

對等: time.windows.com,0x9
狀態: 擱置中
剩餘時間: 603689.4865209s
模式: 0 (保留)
組織層: 0 (未指定)
對等輪詢間隔: 0 (未指定)
主機輪詢間隔: 0 (未指定)

[修改 W32Time 的校時伺服器清單]
我將時間伺服器修改成使用國家時間與頻率標準實驗室的 Server,多台 Server 用空白間隔。(server 後面有加上「0x1」的話,之後可使用 regedit 編輯系統登錄檔的 SpecialPollInterval 設定,來設定校時的間隔時間。)

C:\Windows\system32>w32tm /config /update /manualpeerlist:"tock.stdtime.gov.tw,0x1 watch.stdtime.gov.tw,0x1"
C:\Windows\system32>w32tm /query /peers
#對等: 2

對等: tock.stdtime.gov.tw,0x1
狀態: 使用中
剩餘時間: 4.1709780s
模式: 3 (用戶端)
組織層: 2 (次要參照 - 依 (S)NTP 同步處理)
對等輪詢間隔: 10 (1024s)
主機輪詢間隔: 10 (1024s)

對等: watch.stdtime.gov.tw,0x1
狀態: 使用中
剩餘時間: 4.6397280s
模式: 3 (用戶端)
組織層: 2 (次要參照 - 依 (S)NTP 同步處理)
對等輪詢間隔: 10 (1024s)
主機輪詢間隔: 10 (1024s)

[修改 W32Time 教時的時間間隔 ](當 server 有加上「0x1」設定時)
使用 regedit 編輯系統登錄檔,修改 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers] 底下的 SpecialPollInterval 設定值,設定隔多少秒校時一次(似乎要重新啟動系統才會生效)
(預設是604800秒,7天)

[手動執行 w32tm /resync 校時]
手動校時,可執行 w32tm /resync 指令。

C:\Windows\system32>w32tm /resync
正在傳送 resync 命令給本機電腦
命令已經成功完成。

[使用工作排程校時]
如果不想經由修改系統登錄檔,來設定校時的時間間隔。也可選擇使用工作排程器,定時執行 w32tm /resync 指令來校時。

[執行批次檔校時]
或是使用批次檔,每隔一段時間執行一次 w32tm /resync 校時指令
程式碼如下

@echo off
cd c:
c:

:aa

for /f "tokens=1-4 delims=-/ " %%i IN ("%date%") DO (
set year=%%i
set month=%%j
set day=%%k
)

SET fname=%year%-%month%-%day%
SET fname=%fname: =0%
REM 將執行結果存放在 c:\my_ntp_log\  @ 於 c 碟中 新增 my_ntp_log 目錄,存放log
SET fname=c:\my_ntp_log\%fname%.txt

echo start: %date% %time% >> %fname%
w32tm /resync >> %fname%
echo end: %date% %time% >> %fname%

timeout  /t 900 /nobreak @設定 timeout 為 900 秒
goto aa

pause


另存成 ntp.bat 檔,可用 cmd 執行並自動校對時間伺服器。

查看跟某台時間伺服器(例如:tock.stdtime.gov.tw)的時間差異,/samples:5 顯示5筆樣本資料,/僅顯示資料,不顯示圖形

w32tm /stripchart /computer:tock.stdtime.gov.tw /samples:5 /dataonly

(其他時間伺服器:w32tm /config /update /manualpeerlist:"tock.stdtime.gov.tw watch.stdtime.gov.tw time.stdtime.gov.tw clock.stdtime.gov.tw tick.stdtime.gov.tw")

留言

這個網誌中的熱門文章

c語言-關於#define用法

CMD常用網管指令

PHP 與 JavaScript 之間傳值利用 json