原创文章,遵循 CC 4.0 BY-SA 版权协议

引言

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

  • claude --version 能正常输出 2.1.78,说明命令已安装成功、PATH 配置正确
  • 但只要输入 claudeclaude "hello",终端就会一直卡住,没有任何报错输出

更诡异的是:执行几条命令后偶尔能恢复正常,但重新打开终端后问题再次复发。

一开始我怀疑过各种可能:Claude Code 没装好、PowerShell 版本太低、Node.js/nvm 环境有问题、Windows 终端兼容性不好……但最终定位下来,真正的问题其实非常简单: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 ...
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
...(然后没有后续进展)

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

  1. Claude Code 已经成功启动了 – 它已经开始监听配置文件变更,也在正常写入本地配置。
  2. 本地配置文件写入没有问题.claude.json 被正常原子写入,说明文件权限和磁盘不是问题。
  3. 卡在网络初始化阶段 – 日志显示执行到 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_PROXYHTTPS_PROXYALL_PROXY 这些变量时,Claude Code 启动后会默认将网络请求转发给这些代理地址。如果这些地址对应的代理服务没开,或者端口已经失效,就会变成:

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

而执行 Remove-Item 命令,本质上是在告诉 Claude Code:“不要走代理,直接联网”。于是请求恢复正常,Claude Code 也就正常启动了。


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

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

我一开始也很疑惑:明明刚刚已经修好了,当时执行完删除命令后 Claude 也确实恢复正常了,但只要关闭终端,再重新打开 PowerShell 输入 claude,又卡住了。还得重新执行一次删除代理变量的命令。

后来才意识到:我删掉的只是“当前 PowerShell 会话里的环境变量”,并没有删除 Windows 用户级的持久化环境变量


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

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

层级 作用范围 说明
当前终端会话变量 仅当前窗口 在当前 PowerShell 窗口里临时设置或删除,关闭窗口后丢失
用户级环境变量 当前登录用户 持久化存储,每次打开新终端自动加载
系统级环境变量 整台机器 更高层级的全局变量,对所有用户生效

如果你的 HTTP_PROXYHTTPS_PROXYALL_PROXY 是存在于 “用户环境变量” 里的,那么每开一个新终端,Windows 就会自动把这些变量重新加载进来。这就是为什么你会感觉:“明明删掉了,怎么重新打开终端又复活了?”


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

整个问题的完整链路如下:

  • 表面现象claude 卡住无响应。
  • 直接原因:当前终端里存在无效的代理环境变量。
  • 更深层原因:这些代理变量不是临时出现的,而是已经被持久化到了 用户级环境变量 中。
  • 为什么每次重开终端又坏了? 因为新开的 PowerShell 会自动重新加载用户级环境变量,无效代理又回来了。

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

方案一:使用 PowerShell 命令删除

[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. “用户变量” 列表里查找:
    • HTTP_PROXY
    • HTTPS_PROXY
    • ALL_PROXY
  5. 选中它们,点击 删除
  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 卡住不动
  • 没有任何明显报错
  • 重新打开终端问题又复发

可以按下面的顺序排查:

步骤 操作
1 确认安装没问题:claude --version
2 打开调试日志:$env:DEBUG="*"; claude
3 检查代理环境变量:echo $env:HTTP_PROXY
4 临时清掉当前会话中的代理变量(验证是否为代理问题)
5 如果临时清除后问题解决,删除用户级全局环境变量

临时清除命令:

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 用户级的持久化环境变量

希望这篇博客能帮你快速解决 claude 卡住的问题,也希望能帮你理解 Windows 环境变量的层级逻辑,避免以后再踩类似的坑。


📌 本文为博主原创,遵循 CC 4.0 BY-SA 版权协议。欢迎转载,但请保留原文链接和作者信息。

# claude卡住检查代理后清除代理
Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue

#设置环境变量
$env:ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
$env:ANTHROPIC_AUTH_TOKEN="sk-xxxx"
$env:ANTHROPIC_MODEL="deepseek-v4-pro"
$env:ANTHROPIC_DEFAULT_OPUS_MODEL="deepseek-v4-pro"
$env:ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-v4-pro"
$env:ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-v4-flash"
$env:CLAUDE_CODE_SUBAGENT_MODEL="deepseek-v4-flash"
$env:CLAUDE_CODE_EFFORT_LEVEL="max"

# 自动全执行不用一步一步确认
claude --dangerously-skip-permissions
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐