最近在 Windows 上折腾 Claude Code,遇到了一个很迷惑的问题:

  • claude --version 能正常输出版本号

  • 说明命令已经安装成功

  • 但只要输入 claude,终端就一直卡住,没有报错,也没有输出

  • 更离谱的是,执行几条命令后能恢复正常,但重新打开终端又复发

一开始我以为是:

  • Claude Code 没装好

  • PowerShell 版本太低

  • Node.js / nvm 环境有问题

  • Windows 终端兼容性不好

  • Claude Code 本身有 bug

结果最后定位下来,真正的问题其实很简单:

PowerShell 中残留了无效的代理环境变量,导致 Claude Code 的网络请求被阻塞。

更关键的是,我一开始的修复方式只是清掉了当前终端会话里的变量,并没有删除用户级的全局环境变量,所以每次重开终端,这些代理变量又会自动回来,Claude 就再次卡住。

这篇文章就把整个排查过程和最终解决方案完整整理一下。


一、问题现象

先说现象。

执行下面的命令时:

claude --version

可以正常输出:

2.1.78 (Claude Code)

这说明:

  • Claude Code 已经安装成功

  • 命令已经注册到 PATH

  • npm 全局安装没有问题

  • 可执行文件本身没有损坏

但是当执行下面的命令时:

claude

或者:

claude "hello"

终端就会一直卡住,没有输出,也没有明显报错,看起来像“死掉了一样”。

这类问题最容易让人误判成安装问题,但实际上它已经不是“安装阶段”的问题,而是“运行阶段”的问题。


二、初步判断:安装没问题,问题出在运行时

为什么能先排除安装问题?

因为如果安装真的有问题,常见表现通常是:

  • claude 命令找不到

  • claude --version 报错

  • PATH 没配好

  • npm 全局安装失败

而我的情况是:

claude --version

完全正常。

所以可以得出一个很重要的结论:

Claude Code 本体是好的,问题出在启动后的初始化过程。


三、打开调试日志

为了进一步定位问题,我开启了调试输出:

$env:DEBUG="*"
claude

日志中能看到类似下面的内容:

2026-03-18T13:22:33.650Z [DEBUG] Watching for changes in setting files C:\Users\JumsZHU\.claude, C:\Users\JumsZHU\.claude...
2026-03-18T13:22:33.658Z [DEBUG] Writing to temp file: C:\Users\JumsZHU\.claude.json.tmp.21428.1773840153658
2026-03-18T13:22:33.659Z [DEBUG] Preserving file permissions: 100666
2026-03-18T13:22:33.659Z [DEBUG] Temp file written successfully, size: 164 bytes
2026-03-18T13:22:33.659Z [DEBUG] Applied original permissions to temp file
2026-03-18T13:22:33.660Z [DEBUG] Renaming C:\Users\JumsZHU\.claude.json.tmp.21428.1773840153658 to C:\Users\JumsZHU\.claude.json
2026-03-18T13:22:33.660Z [DEBUG] File C:\Users\JumsZHU\.claude.json written atomically
2026-03-18T13:22:33.673Z [DEBUG] [init] configureGlobalMTLS starting
2026-03-18T13:22:33.673Z [DEBUG] [init] configureGlobalMTLS complete
2026-03-18T13:22:33.673Z [DEBUG] [init] configureGlobalAgents starting
2026-03-18T13:22:35.401Z [DEBUG] Writing to temp file: C:\Users\JumsZHU\.claude.json.tmp.21428.1773840155401
2026-03-18T13:22:35.402Z [DEBUG] Preserving file permissions: 100666
2026-03-18T13:22:35.402Z [DEBUG] Temp file written successfully, size: 239 bytes
2026-03-18T13:22:35.402Z [DEBUG] Applied original permissions to temp file
2026-03-18T13:22:35.402Z [DEBUG] Renaming C:\Users\JumsZHU\.claude.json.tmp.21428.1773840155401 to C:\Users\JumsZHU\.claude.json
2026-03-18T13:22:35.403Z [DEBUG] File C:\Users\JumsZHU\.claude.json written atomically

从这段日志里,其实能看出几个关键信息:

1. Claude Code 已经成功启动了

因为它已经开始监听配置文件变更,也在正常写入本地配置。

2. 本地配置文件写入没有问题

.claude.json 被正常原子写入,说明权限和文件系统不是问题。

3. 卡在网络初始化阶段

日志里能看到:

[init] configureGlobalMTLS starting
[init] configureGlobalMTLS complete
[init] configureGlobalAgents starting

然后基本就没后文了。

这通常意味着:

Claude Code 并不是一启动就崩,而是在网络代理/全局 agent 初始化的环节卡住了。


四、怀疑方向转向代理环境变量

到了这一步,怀疑重点就从“安装问题”转移到了“网络配置问题”。

接下来我检查了 PowerShell 当前会话中的代理环境变量:

echo $env:HTTP_PROXY
echo $env:HTTPS_PROXY
echo $env:ALL_PROXY

这一步非常关键。

因为很多命令行工具,包括:

  • Claude Code

  • npm

  • git

  • curl

  • 一些 Node.js CLI 工具

都会优先读取这些环境变量。

只要这些变量存在,CLI 工具就会默认:

“所有网络请求都走代理。”

问题在于,代理变量存在,不代表代理真的可用。

常见的坑有这些:

  • 代理软件没开

  • 代理端口变了

  • 以前设过的代理值已经失效

  • 浏览器能上网,但 CLI 走的是另一套代理逻辑

  • Windows 系统代理和环境变量代理冲突

于是就会出现一个很诡异的现象:

  • 浏览器可以正常打开网页

  • 但 Claude Code 一直卡住不动


五、临时解决方案:清掉当前终端中的代理变量

为了验证是不是代理问题,我先执行了下面这几条命令:

Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue

然后重新执行:

claude

结果 Claude Code 立刻恢复正常。

这时候问题其实已经定位得很清楚了:

并不是 Claude Code 坏了,而是它启动时读取到了一个无效的代理配置,导致请求被卡在了代理那一层。


六、为什么删掉后就好了?

这个原理其实很简单。

当环境里存在这些变量时:

HTTP_PROXY
HTTPS_PROXY
ALL_PROXY

Claude Code 启动后会默认把请求转发给这些代理地址。

如果这些地址对应的代理根本没开,或者端口已经失效,就会变成这样:

Claude Code -> 请求走代理 -> 代理地址不可用 -> 请求一直阻塞 -> 表现为终端卡住

而当我执行:

Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY
Remove-Item Env:ALL_PROXY

本质上是在告诉 Claude Code:

不要走代理,直接联网。

于是请求恢复正常,Claude Code 也就能正常启动了。


七、为什么重新打开终端又复发?

这个问题才是最坑的地方。

我一开始也很疑惑:

  • 明明刚刚已经修好了

  • 当时执行完命令,Claude 也确实恢复正常了

  • 但是只要关闭终端,再重新打开 PowerShell

  • 输入 claude 又卡住了

  • 还得重新执行一次删除代理变量的命令

后来才意识到,问题在于:

我删掉的只是“当前 PowerShell 会话里的环境变量”,并没有删除 Windows 用户级的持久化环境变量。


八、Windows 环境变量有三层,这里最容易踩坑

Windows 下环境变量大致可以分成三层:

1. 当前终端会话变量

也就是你在当前 PowerShell 窗口里临时设置或删除的变量。

比如:

Remove-Item Env:HTTP_PROXY

这个操作只影响当前窗口。

一旦你关闭这个 PowerShell 窗口,刚刚删掉的内容就没了。


2. 用户级环境变量

这是当前登录用户的持久化环境变量。

只要打开新的终端,Windows 就会自动把这些变量重新加载进来。

所以如果你的 HTTP_PROXYHTTPS_PROXYALL_PROXY 是存在于“用户环境变量”里的,那么你每开一个新终端,这些代理值都会自动回来。

这就是为什么你会感觉:

“明明删掉了,怎么重新打开终端又复活了?”


3. 系统级环境变量

这是更高层级的全局环境变量,对整台机器生效。

有些公司电脑或者一些开发工具,也可能把代理变量写到系统级环境变量里。


九、真正的根因:删掉的只是临时变量,全局变量还在

所以整个问题的完整链路其实是这样的:

表面现象

Claude Code 输入 claude 卡住无响应。

直接原因

当前终端里存在无效代理环境变量。

更深层原因

这些代理变量不是临时出现的,而是已经被持久化到了用户级环境变量中。

为什么每次重开终端又坏了?

因为新开的 PowerShell 会自动重新加载用户级环境变量,所以无效代理又被带回来了。


十、永久解决方案:删除用户级环境变量

如果只是想临时恢复,可以执行:

Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue

但如果想彻底解决,需要删除 Windows 用户级环境变量:

[Environment]::SetEnvironmentVariable("HTTP_PROXY", $null, "User")
[Environment]::SetEnvironmentVariable("HTTPS_PROXY", $null, "User")
[Environment]::SetEnvironmentVariable("ALL_PROXY", $null, "User")

执行完之后:

  1. 关闭当前终端

  2. 重新打开 PowerShell

  3. 再次检查:

echo $env:HTTP_PROXY
echo $env:HTTPS_PROXY
echo $env:ALL_PROXY

如果这三个值都是空的,说明已经删除成功。

这时候再执行:

claude

一般就不会再复发了。


十一、也可以用图形界面删除

如果你不想用 PowerShell,也可以用 Windows 图形界面操作。

路径如下:

  1. 打开“开始菜单”

  2. 搜索“环境变量”

  3. 点击“编辑系统环境变量”

  4. 打开“环境变量”

  5. 在“用户变量”里查找:

    • HTTP_PROXY

    • HTTPS_PROXY

    • ALL_PROXY

  6. 把它们删除

如果你怀疑系统级环境变量里也有同样的值,也可以顺便检查“系统变量”。


十二、为什么这个坑特别隐蔽?

这个问题隐蔽在几个地方。

1. 没有直接报错

很多时候并不会明确输出 ECONNREFUSEDETIMEDOUT,而只是单纯卡住。

2. claude --version 是正常的

这会让人误以为 Claude 已经完全没问题。

实际上,版本命令和真正进入会话是两回事。

3. 浏览器正常,不代表 CLI 正常

浏览器走的是系统代理逻辑,而命令行工具往往更依赖环境变量。

4. 很容易误判成别的问题

尤其在 Windows 下,大家第一反应通常是:

  • PowerShell 版本问题

  • Node.js 版本问题

  • nvm 配置问题

  • PATH 问题

  • 终端兼容问题

但这次真正的问题其实跟这些都没关系。


十三、以后如何避免再踩这个坑?

最简单的建议就是:

不要长期把代理环境变量写死在系统里。

更稳妥的做法是“按需开启,按需关闭”。

比如可以在 PowerShell 里定义两个函数:

function proxy-on {
$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"
}

function proxy-off {
Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue
}

需要代理时:

proxy-on

不用代理时:

proxy-off

这样比长期写死在用户环境变量里安全得多。


十四、完整排查流程总结

如果你也遇到下面这种情况:

  • claude --version 正常

  • claude 卡住不动

  • 没有任何明显报错

  • 重新开终端问题又复发

可以按下面的顺序排查:

第一步:确认安装没问题

claude --version

第二步:打开调试日志

$env:DEBUG="*"
claude

第三步:检查代理环境变量

echo $env:HTTP_PROXY
echo $env:HTTPS_PROXY
echo $env:ALL_PROXY

第四步:临时清掉当前会话中的代理变量

Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue

第五步:如果问题解决,再删除用户级全局环境变量

[Environment]::SetEnvironmentVariable("HTTP_PROXY", $null, "User")
[Environment]::SetEnvironmentVariable("HTTPS_PROXY", $null, "User")
[Environment]::SetEnvironmentVariable("ALL_PROXY", $null, "User")

十五、一句话结论

这次问题的本质不是 Claude Code 安装失败,也不是 PowerShell 坏了,而是:

用户级环境变量里残留了无效的代理配置,导致 Claude Code 在网络初始化阶段被卡住。

而之所以“执行完删除命令就好了,但重开终端又坏”,是因为:

你删掉的只是当前 PowerShell 会话里的变量,没有删除 Windows 用户级的持久化环境变量。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐