Windows 下让 OpenClaw Gateway 开机自启并自动打开 Dashboard
部署 OpenClaw Gateway 时,最烦的不是启动命令本身,而是 Windows 这边的几个小坑:进程没退干净,下一次就会报 already running (pid xxx);计划任务能建出来,但权限和执行上下文不对,实际不会跑;如果直接静默启动,Dashboard 也不会跟着打开,出了问题只能回头翻日志。
我最后还是把这几件事拆开处理了:先清理残留进程和 lock 文件,再用计划任务拉起脚本,启动过程保持可见,最后再把浏览器打开到 Dashboard。这样不算优雅,但比单纯依赖 openclaw gateway install 稳得多。
先把脚本放到固定位置
脚本路径建议放在系统级目录里,比如 C:\ProgramData\OpenClaw\startup.ps1。这样比放在用户目录里省事,任务计划、权限和后续排障都更统一。
New-Item -Path "C:\ProgramData\OpenClaw" -ItemType Directory -Force
$acl = Get-Acl "C:\ProgramData\OpenClaw"
$acl.SetAccessRuleProtection($true, $false)
Set-Acl -Path "C:\ProgramData\OpenClaw" -AclObject $acl
先清理残留进程,再启动
already running 这类问题,很多时候不是服务真在跑,而是上一次退出不完整。只杀单个 PID 不够,进程树里挂着的子进程也要一起处理。
function Stop-ProcessTree {
param($pid)
Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq $pid } | ForEach-Object { Stop-ProcessTree $_.ProcessId }
Stop-Process -Id $pid -Force -ErrorAction SilentlyContinue
}
Get-Process -Name node,openclaw -ErrorAction SilentlyContinue | ForEach-Object { Stop-ProcessTree $_.Id }
lock 文件也顺手删掉。这里我没有做太多花哨判断,目标就是在启动前把脏状态清掉,免得 Gateway 继续抱着旧状态不放。
$LockFiles = @( "$env:USERPROFILE\.openclaw\gateway.lock", "$env:LOCALAPPDATA\Temp\openclaw\*.lock" )
foreach ($file in $LockFiles) {
if (Test-Path $file) {
Remove-Item $file -Force
Add-Content -Path "$env:ProgramData\OpenClaw\cleanup.log" -Value "$(Get-Date) Removed: $file"
}
}
用计划任务做开机自启
与其依赖交互式窗口,不如直接让任务计划在登录后拉起脚本。这里用 PowerShell 原生命令比 openclaw gateway install 更可控,至少权限、延迟和失败后的行为都能看得见。
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"C:\ProgramData\OpenClaw\startup.ps1`""
$trigger = New-ScheduledTaskTrigger -AtLogOn -RandomDelay (New-TimeSpan -Seconds 30)
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName "OpenClaw Gateway" -Action $action -Trigger $trigger -Settings $settings -RunLevel Highest -Force
这里加了 30 秒随机延迟,主要是给系统启动留一点缓冲。Windows 刚登录那几秒,网络、磁盘和用户环境都还没完全稳住,太早起服务经常会碰壁。
让 Dashboard 自动打开
浏览器启动这一步,最好放在 Gateway 起起来之后再做。严格来说应该先等端口可用,再打开地址;我这里保留一个简单重试,够用,也容易看懂。

