Windows 下 Claude Code 输入 claude 卡住无响应?问题原来出在代理环境变量
在 Windows 上安装 Claude Code 后,claude --version 正常,但输入 claude 一直卡住无响应。排查后发现,并不是安装失败,也不是 PowerShell 或 Node.js 的问题,而是用户环境变量中残留了无效的代理配置(如 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY),导致 Claude Code 的网络请求被阻塞。临时删除当前会话中的
最近在 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_PROXY、HTTPS_PROXY、ALL_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")
执行完之后:
-
关闭当前终端
-
重新打开 PowerShell
-
再次检查:
echo $env:HTTP_PROXY
echo $env:HTTPS_PROXY
echo $env:ALL_PROXY
如果这三个值都是空的,说明已经删除成功。
这时候再执行:
claude
一般就不会再复发了。
十一、也可以用图形界面删除
如果你不想用 PowerShell,也可以用 Windows 图形界面操作。
路径如下:
-
打开“开始菜单”
-
搜索“环境变量”
-
点击“编辑系统环境变量”
-
打开“环境变量”
-
在“用户变量”里查找:
-
HTTP_PROXY -
HTTPS_PROXY -
ALL_PROXY
-
-
把它们删除
如果你怀疑系统级环境变量里也有同样的值,也可以顺便检查“系统变量”。
十二、为什么这个坑特别隐蔽?
这个问题隐蔽在几个地方。
1. 没有直接报错
很多时候并不会明确输出 ECONNREFUSED 或 ETIMEDOUT,而只是单纯卡住。
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 用户级的持久化环境变量。
更多推荐
所有评论(0)