Windows 版 Codex 更新后有进程但打不开窗口:排查与修复方法
最近我遇到了一个 Windows 版 Codex 的启动问题:
Codex 更新之后,点击图标没有任何反应,但任务管理器里能看到 ChatGPT.exe 进程存在。程序既不会出现在托盘,也不会显示主窗口。
更奇怪的是,反复杀掉进程、重新启动也没有用,但放着不管十几分钟甚至一个小时之后,它偶尔又会自己恢复。
经过排查,我这边最终发现其实有两层问题,其中真正导致 Codex 无法启动的是 cua_node runtime 在更新后的复制过程失败。
下面记录完整排查和修复过程。
一、问题表现
典型症状:
-
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_node runtime 完整复制到正确的 runtime 目录。
关键在于使用:
xcopy /G
第一步:关闭 Codex
Get-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_ENABLED=false
│
│ ↓
│
│ 绕过内置更新逻辑
│
└─ 第二层:cua_node runtime relocation 失败
│
├─ 出现大量 .staging-* 目录
├─ node.exe 存在
├─ node_repl.exe 缺失
└─ manifest.json 缺失
↓
使用 xcopy /G 手动复制完整 runtime
↓
NodeExe=True
NodeRepl=True
Manifest=True
↓
Codex 恢复正常启动
十、几个需要注意的地方
第一,不建议一上来就删除整个:
%LOCALAPPDATA%\OpenAI\Codex
因为问题并不一定来自用户配置。
第二,不建议修改:
C:\Program Files\WindowsApps
的所有权或者 ACL 权限。
修复过程中完全不需要这么做。
第三,不建议反复重装 Codex。
如果 MSIX:
Status = Ok
而同时又出现大量不完整 .staging-*,重装很可能只是暂时恢复,下一次版本更新还可能重新遇到。
第四,runtime ID 每个版本可能不同。
例如我的:
8e7585fc8f35ed57
只能作为示例。
必须从自己机器上的:
.staging-<runtime-id>-<random>
中提取真正的 runtime ID。
第五,如果只是设置:
CODEX_SPARKLE_ENABLED=false
之后仍然打不开,不代表这个变量没有生效。
它解决的是 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_node runtime 复制失败。
使用:
xcopy /G
把 Codex 安装包内的完整 cua_node 手动复制到对应 runtime ID 目录,在我的机器上成功解决了这个问题。
修复前:
True False False
修复后:
True True True
Codex 随即恢复正常启动。
如果以后 Codex 再次更新并重新出现同样问题,需要重新检查新的 .staging-* 对应的 runtime ID,因为新的版本可能会使用新的 runtime hash。
更多推荐



所有评论(0)