
最近我遇到了一个 Windows 版 Codex 的启动问题Codex 更新之后点击图标没有任何反应但任务管理器里能看到ChatGPT.exe进程存在。程序既不会出现在托盘也不会显示主窗口。更奇怪的是反复杀掉进程、重新启动也没有用但放着不管十几分钟甚至一个小时之后它偶尔又会自己恢复。经过排查我这边最终发现其实有两层问题其中真正导致 Codex 无法启动的是cua_noderuntime 在更新后的复制过程失败。下面记录完整排查和修复过程。一、问题表现典型症状Codex 更新之后无法打开任务管理器中存在ChatGPT.exe没有 Codex 主窗口没有托盘图标杀掉进程重新启动仍然无效等待一段时间之后有时会突然自己恢复下一次更新之后又可能再次出现。如果你遇到的情况基本一致可以继续往下排查。二、先检查 Codex 本体是否正常推荐使用 Windows 自带的 PowerShell 5.1。按Win R输入powershell.exe然后执行Get-AppxPackage -Name OpenAI.Codex | Select Name, Version, Status, PackageFullName, InstallLocation我的结果类似Name : OpenAI.Codex Version : 26.901.2854.0 Status : Ok如果Status : Ok说明 MSIX / Microsoft Store 安装包本身基本正常。如果出现NeedsRemediation或者其他异常状态那么可能属于包注册损坏问题需要优先考虑 Windows 的应用修复或重新安装。三、检查是不是“进程存在但没有主窗口”运行Get-Process ChatGPT -ErrorAction SilentlyContinue | Select Id, ProcessName, Responding, MainWindowHandle, MainWindowTitle, Path如果看到类似Responding : True MainWindowHandle : 0 MainWindowTitle :那么说明Codex 并不是完全没有启动。ChatGPT.exe已经运行了只是 Electron 主窗口根本没有成功创建。这个现象非常重要因为它可以把问题从“Windows 没启动程序”进一步缩小到“Codex 初始化过程中卡住”。四、第一层问题Codex 内置 updater 卡住部分 Windows Codex 更新后会卡在 Codex 自己的 in-app updater / Sparkle 更新逻辑上。可以尝试关闭 Codex 内置 updater让 Microsoft Store 负责更新。执行[Environment]::SetEnvironmentVariable( CODEX_SPARKLE_ENABLED, false, User )验证[Environment]::GetEnvironmentVariable( CODEX_SPARKLE_ENABLED, User )如果返回false说明环境变量设置成功。建议设置完成之后注销 Windows 或重启电脑一次。这一步可以解决一部分“更新后需要等几分钟才启动”的问题。但我自己的机器设置完这个变量之后Codex 仍然无法打开。于是继续排查。五、真正的问题cua_node runtime staging 失败Codex Windows 版会把自带的一套 Node runtime 从C:\Program Files\WindowsApps\...复制到%LOCALAPPDATA%\OpenAI\Codex\runtimes\cua_node更新之后Codex 会建立新的 runtime。如果这个复制过程失败就会出现大量类似目录.staging-xxxxxxxxxxxxxxxx-xxxxxx但始终无法生成最终的完整 runtime。可以执行下面的命令检查$root $env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node Get-ChildItem $root -Directory -Force -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 10 | ForEach-Object { [PSCustomObject]{ Name $_.Name NodeExe Test-Path $($_.FullName)\bin\node.exe NodeRepl Test-Path $($_.FullName)\bin\node_repl.exe Manifest Test-Path $($_.FullName)\manifest.json } }我当时得到的结果是Name NodeExe NodeRepl Manifest ---- ------- -------- -------- .staging-8e7585fc8f35ed57-rsAX9n True False False .staging-8e7585fc8f35ed57-rCN2Sp True False False .staging-8e7585fc8f35ed57-2l7wnh True False False .staging-8e7585fc8f35ed57-A998JV True False False ...这里的信息非常关键。每一次启动都会创建新的.staging-8e7585fc8f35ed57-xxxxxx说明 Codex 一直在尝试创建8e7585fc8f35ed57这个 runtime。但是每次结果都是node.exe True node_repl.exe False manifest.json False也就是说复制永远进行到一半就失败。因此 Codex 每次启动过程实际上是启动 Codex ↓ 发现新的 cua_node runtime 不存在 ↓ 创建 .staging-* 临时目录 ↓ 从 WindowsApps 复制 runtime ↓ 部分文件复制失败 ↓ staging 无法 finalize ↓ renderer / app-server 无法继续初始化 ↓ ChatGPT.exe 进程存在 ↓ 但主窗口始终不出现这也解释了为什么疯狂地杀进程 → 重启 → 杀进程 → 重启完全没有效果。每次重启只是又多制造一个新的.staging-*。六、修复方法核心方法非常简单不要让 Codex 自己复制。手动把 Microsoft Store 安装包里的cua_noderuntime 完整复制到正确的 runtime 目录。关键在于使用xcopy /G第一步关闭 CodexGet-Process ChatGPT -ErrorAction SilentlyContinue | Stop-Process -Force第二步找到当前 Codex 安装目录$pkg Get-AppxPackage OpenAI.Codex源 runtime 位于$src Join-Path $pkg.InstallLocation app\resources\cua_node可以查看$src例如C:\Program Files\WindowsApps\OpenAI.Codex_26.901.2854.0_x64__2p2nqsd0c76g0\app\resources\cua_node第三步确定 runtime ID从前面的.staging-*目录名中可以看出来。例如.staging-8e7585fc8f35ed57-rsAX9n .staging-8e7585fc8f35ed57-rCN2Sp那么 runtime ID 就是8e7585fc8f35ed57注意这个值会随着 Codex 版本发生变化。不要直接照抄我的 ID。应该使用你自己机器上.staging-*中对应的 ID。第四步创建最终 runtime 目录假设 runtime ID 是8e7585fc8f35ed57执行$dst $env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node\8e7585fc8f35ed57 New-Item -ItemType Directory -Force -Path $dst | Out-Null第五步使用 xcopy /G 完整复制执行 xcopy.exe $src\* $dst\ /E /I /H /Y /G参数含义大致如下/E 复制所有子目录 /I 将目标视为目录 /H 包括隐藏和系统文件 /Y 覆盖时不询问 /G 允许将加密/受保护来源复制成普通目标文件这里最关键的就是/G我的机器最终显示复制了 4683 个文件说明整个 runtime 已经被完整复制过去。七、验证修复是否成功执行$dst $env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node\8e7585fc8f35ed57 [PSCustomObject]{ NodeExe Test-Path $dst\bin\node.exe NodeRepl Test-Path $dst\bin\node_repl.exe Manifest Test-Path $dst\manifest.json }正常应该看到NodeExe NodeRepl Manifest ------- -------- -------- True True True我的机器修复之前是True False False修复以后变成True True True随后 Codex 立即恢复正常启动。八、启动 Codex可以直接从开始菜单正常启动。如果希望从 PowerShell 启动可以使用$env:CODEX_SPARKLE_ENABLED false $pkg Get-AppxPackage OpenAI.Codex $exe Join-Path $pkg.InstallLocation app\ChatGPT.exe Invoke-CommandInDesktopPackage -PackageFamilyName $pkg.PackageFamilyName -AppId App -Command $exe如果前面的 runtime 已经完整这时 Codex 应该可以正常创建窗口。九、整个问题的逻辑我最终遇到的情况可以总结成两层Codex 更新后打不开 │ ├─ 第一层Codex 内置 updater / Sparkle │ │ CODEX_SPARKLE_ENABLEDfalse │ │ ↓ │ │ 绕过内置更新逻辑 │ └─ 第二层cua_node runtime relocation 失败 │ ├─ 出现大量 .staging-* 目录 ├─ node.exe 存在 ├─ node_repl.exe 缺失 └─ manifest.json 缺失 ↓ 使用 xcopy /G 手动复制完整 runtime ↓ NodeExeTrue NodeReplTrue ManifestTrue ↓ Codex 恢复正常启动十、几个需要注意的地方第一不建议一上来就删除整个%LOCALAPPDATA%\OpenAI\Codex因为问题并不一定来自用户配置。第二不建议修改C:\Program Files\WindowsApps的所有权或者 ACL 权限。修复过程中完全不需要这么做。第三不建议反复重装 Codex。如果 MSIXStatus Ok而同时又出现大量不完整.staging-*重装很可能只是暂时恢复下一次版本更新还可能重新遇到。第四runtime ID 每个版本可能不同。例如我的8e7585fc8f35ed57只能作为示例。必须从自己机器上的.staging-runtime-id-random中提取真正的 runtime ID。第五如果只是设置CODEX_SPARKLE_ENABLEDfalse之后仍然打不开不代表这个变量没有生效。它解决的是 updater 问题。如果cua_node已经发生 staging 失败还需要单独修复 runtime。最后总结如果你的 Windows Codex 更新后出现任务管理器有 ChatGPT.exe 但没有任何窗口可以优先检查%LOCALAPPDATA%\OpenAI\Codex\runtimes\cua_node如果里面出现大量.staging-xxxxxxxxxxxxxxxx-xxxxxx并且node.exe True node_repl.exe False manifest.json False那么很可能就是cua_noderuntime 复制失败。使用xcopy /G把 Codex 安装包内的完整cua_node手动复制到对应 runtime ID 目录在我的机器上成功解决了这个问题。修复前True False False修复后True True TrueCodex 随即恢复正常启动。如果以后 Codex 再次更新并重新出现同样问题需要重新检查新的.staging-*对应的 runtime ID因为新的版本可能会使用新的 runtime hash。