PowerShell脚本可调用w32tm命令手动同步Windows系统时间,并通过任务计划程序实现定时校时,无需第三方工具;脚本需配置NTP源、启停w32time服务、强制同步并支持日志记录与错误处理。
在 windows 中,powershell 脚本可以调用 w32tm 命令手动同步系统时间,再配合 windows 任务计划程序实现定时校时。无需第三方工具,原生支持,稳定可靠。
一、编写 PowerShell 同步脚本(.ps1 文件)
新建一个文本文件,例如 Sync-NtpTime.ps1,内容如下:
```powershell
# 强制指定 NTP 服务器(可选多个,用空格分隔)
$NtpServer = "time.windows.com"
# 设置本地时间服务为手动启动(避免冲突)
Set-Service w32time -StartupType Manual
# 启动时间服务(如未运行)
Start-Service w32time -ErrorAction SilentlyContinue
# 配置 NTP 源并强制同步
w32tm /config /syncfromflags:manual /manualpeerlist:$NtpServer /reliable:yes /update
w32tm /resync /force
# 可选:输出当前时间与同步状态供日志参考
Write-Host "同步完成,当前时间:$(Get-Date)"
Write-Host "时间源状态:$((w32tm /query /source)[0])"
```
⚠️ 注意:
• 保存为 UTF-8 编码(推荐用 VS Code 或记事本“另存为”时选 UTF-8);
• 若执行报错“无法加载脚本”,需先以管理员身份运行 PowerShell,执行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser;
• time.windows.com 是微软官方 NTP 服务器,也可替换为 pool.ntp.org 或国内可用的 ntp.aliyun.com。
二、创建计划任务(GUI 或命令行)
推荐使用 PowerShell 命令自动创建(管理员权限运行):
```powershell
$Action = New-ScheduledTaskAction -Execute 'PowerShell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Sync-NtpTime.ps1"'
$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 6)
$Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM"
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
-StartWhenAvailable -RunOnlyIfNetworkAvailable
Register-ScheduledTask -TaskName "AutoSync-NTP-Time" `
-Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings
```
说明:
• 上例设置为“每 6 小时同步一次”,首次立即触发;
• 使用 SYSTEM 账户运行,无需登录用户凭据,更安全;
• -RunOnlyIfNetworkAvailable 避免离线时失败;
• 脚本路径 C:\Scripts\Sync-NtpTime.ps1 需按实际存放位置修改。
三、验证与排错建议
✅ 手动测试脚本:
• 以管理员身份打开 PowerShell,运行脚本:
.\C:\Scripts\Sync-NtpTime.ps1
• 查看输出是否显示“同步完成”,再执行 w32tm /query /status 确认源和偏差。
? 常见问题:
• “拒绝访问”或“服务未响应” → 确保以管理员身份运行脚本和任务;
• 同步后时间仍不准 → 检查防火墙是否放行 UDP 123 端口;
• 任务不执行 → 在“任务计划程序库”中右键任务 → “运行”,观察错误代码(如 0x1、0x2 表示路径或权限问题);
• 想查看历史日志 → 事件查看器 → Windows 日志 → System,筛选来源为 W32Time。
四、进阶:静默运行 + 记录日志(可选)
修改脚本末尾添加日志记录,便于追踪:
```powershell
$LogPath = "C:\Scripts\NtpSync.log"
"$(Get-Date): $(w32tm /query /status | Select-String 'Source\|Seconds')" | Out-File -FilePath $LogPath -Append
```
这样每次同步会追加一行时间戳和当前时间源/偏移量,方便排查长期漂移问题。

















