Windows 安装 Claude Code 完整教程:国内网络下的三个坑

作者:

环境:Windows 11 / HP Z4 G4 / 路由器跑 OpenWrt + OpenClash(TUN 模式) 版本:Claude Code v2.1.240 更新日期:2026-08-23

Claude Code 现在原生支持 Windows,不需要 WSL,也不需要 Node.js。但如果你人在国内,官方文档给的那条安装命令大概率跑不通。

这篇文章分两部分:前半段是正确的安装流程,照着做三分钟能装完;后半段是我实际踩的三个坑,包括一个在 OpenClash 的 LuCI 界面上完全找不到入口的认证配置。

如果你只想装上,看完第一部分就够了。



一、正确的安装流程

1. 装 Git for Windows(建议,非必需)

下载地址:https://git-scm.com/downloads/win

不装的话 Claude Code 会退回用 PowerShell 作为 shell 工具。装了才能用 Git Bash,也才能让它帮你跑 git 命令、执行 bash 脚本、用 grep / sed / awk 那一套。

安装向导里其他选项保持默认,只有 PATH 那一屏选中间那项

Git from the command line and also from 3rd-party software

装完之后如果 Claude Code 找不到 Git Bash,可以在 C:\Users\你的用户名\.claude\settings.json 里手动指路:

{
  "env": {
    "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"
  }
}

2. 安装 Claude Code

winget install Anthropic.ClaudeCode

约 320 MB,下载需要几分钟。装完不用重启电脑,但要关掉终端重开一个,让 PATH 生效。

3. 验证安装

claude --version
claude doctor

claude doctor 会打印一份安装健康报告:

Claude Code doctor
Running: package-manager (2.1.240)
Platform: win32-x64
Package manager: winget
Path: C:\Users\...\WinGet\Packages\Anthropic.ClaudeCode_...\claude.exe
Auto-updates: Managed by package manager
Auto-update channel: latest

重点看 Auto-updates: Managed by package manager 这一行——说明自动更新是通的,以后 Claude Code 会自己调用 winget 完成升级,你不用手动管。

这时候还没登录,所以会提示 Not signed in to claude.ai,正常。

4. 登录

claude auth login

会拉起浏览器完成 OAuth 授权。需要 Pro、Max、Team 或 Enterprise 订阅,免费账号用不了。

如果浏览器回调失败(国内网络下有时会遇到),命令行会给你一个 URL 和一个粘贴授权码的提示,手动完成即可。

登录状态保存在 C:\Users\你的用户名\.claude\只需要登录一次,以后启动不会再要求授权。

5. 启动会话

cd C:\你的项目目录
claude

**一定要 cd 到具体项目目录再启动。**Claude Code 启动时会扫描当前目录建立上下文,默认也只能读写这个目录树内的文件。在空文件夹里起会话,它什么都看不见。

第一次进入会有初始化向导:

  1. 选择配色主题(可以后面用 /theme 改)
  2. 选择账号类型(Pro/Max/Team/Enterprise 选第一项)
  3. 安全提示(回车继续)
  4. 确认信任当前文件夹

这些步骤没有一个是不可逆的,全都能在会话里用 /config/theme 改回来。

进入会话后直接打字提问,中文也可以。

6. 常用会话命令

命令作用
/doctor完整检查并可自动修复问题
/model切换模型
/skills查看已加载的 skill
/config修改配置
/init自动生成 CLAUDE.md 项目说明
/exit退出会话
!命令在会话内执行 shell 命令,不用退出

二、坑一:官方安装脚本被 Cloudflare 挡住

现象

官方文档给的安装命令是:

irm https://claude.ai/install.ps1 | iex

在国内执行,返回的不是脚本,而是一大坨 HTML:

irm : Just a moment...*{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;...}
Enable JavaScript and cookies to continue(function(){
window._cf_chl_opt = {cFPWv: 'b', cRay: 'a2f85fb93fe05e16', cType: 'managed', cZone: 'claude.ai', ...}
...
At line:1 char:1
+ irm https://claude.ai/install.ps1 | iex
    + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException

关键特征:Just a moment..._cf_chl_optcType: 'managed'cZone: 'claude.ai'

原因

这是 Cloudflare 的 managed challenge。它要求客户端执行一段 JavaScript 来证明自己是浏览器,通过之后才放行。

Invoke-RestMethodirm)只是一个 HTTP 客户端,它执行不了 JavaScript

所以这不是配置问题,是原理上走不通。挂代理也没用——除非你能换到一个不被 Cloudflare 挑战的出口 IP,但这个你控制不了,数据中心 IP 段被下挑战是常态。

解法

用 winget。它从微软的包源拉取,完全不碰 claude.ai 这个域名:

winget install Anthropic.ClaudeCode

如果 winget 本身也需要代理(少见),它走的是 WinHTTP 通道:

# 需要管理员权限
netsh winhttp set proxy 你的代理地址:端口
winget install Anthropic.ClaudeCode
netsh winhttp reset proxy

关于自动更新

很多人用 irm 那条命令是图它的自动更新能力。winget 装的版本一样有:

Auto-updates: Managed by package manager
Auto-update channel: latest

Claude Code 会自行调用 winget 完成升级。当它检测到新版本时,会在会话界面右下角提示:

Update available! Run: winget upgrade Anthropic.ClaudeCode

需要手动跑一次是因为 Windows 会锁住正在运行的 exe,退出会话后执行即可。

原始需求(自动更新)是满足的,只是换了实现路径。


三、坑二:PowerShell 5.1 不读代理环境变量

现象

看到 Cloudflare 挑战页,第一反应是网络问题,于是设代理:

$env:HTTPS_PROXY="http://192.168.1.1:7890"
$env:HTTP_PROXY="http://192.168.1.1:7890"
irm https://claude.ai/install.ps1 | iex

结果完全没有变化,返回的还是那一坨挑战页 HTML,行为跟裸连一模一样。

原因

Windows PowerShell 5.1 的 Invoke-RestMethod 不读 HTTP_PROXY / HTTPS_PROXY 环境变量。

它走的是 .NET 的 System.Net.WebRequest.DefaultWebProxy,也就是 IE / WinINET 那套系统代理设置。读环境变量是 PowerShell 7 (pwsh) 才有的行为。

Windows 11 默认预装的是 5.1,不是 7。

怎么判断自己用的是哪个版本

方法一:看报错格式。

PowerShell 5.1 的报错长这样:

irm : Just a moment...
At line:1 char:1
+ irm https://claude.ai/install.ps1 | iex
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException

特征是 System.Net.HttpWebRequest+ ~~~~~ 那种波浪线标记。

PowerShell 7 的报错格式完全不同:

Invoke-RestMethod: The proxy tunnel request to proxy 'http://192.168.1.1:7890/' failed with status code '407'.

方法二:直接查。

$PSVersionTable.PSVersion

解法

方案 A:装 PowerShell 7(推荐)

winget install Microsoft.PowerShell

⚠️ **装完之后必须敲 pwsh 才能进去。**winget 只是把它装到磁盘上,你当前这个窗口还是 5.1。我在这里又浪费了一次时间——以为装完就自动切换了。

pwsh
$PSVersionTable.PSVersion    # 确认显示 7.x

方案 B:在 5.1 里正确设置代理

如果不想装 pwsh,需要设 DefaultWebProxy

$p = New-Object System.Net.WebProxy("http://192.168.1.1:7890")
[System.Net.WebRequest]::DefaultWebProxy = $p
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

注意:只在 irm 上加 -Proxy 参数是不够的,因为安装脚本内部还会去下载二进制文件,那部分请求会绕过代理直接出去。设 DefaultWebProxy 才能覆盖全部。

方案 C:给 WinHTTP 设代理

影响 winget 等走 WinHTTP 的程序:

netsh winhttp set proxy 192.168.1.1:7890
netsh winhttp show proxy      # 验证
netsh winhttp reset proxy     # 用完还原

补充:注册表里的代理设置也会生效

如果你以前用过 v2rayN、Clash for Windows 之类的客户端,它们可能在系统代理里留下了配置:

Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" | Select ProxyEnable, ProxyServer

ProxyEnable1 说明系统代理是开的。这会影响 PowerShell 5.1 和一部分程序的行为。


四、坑三:OpenClash 的代理认证藏在 UCI 里

这一节比较硬核,只在你用 OpenWrt + OpenClash 且遇到 407 报错时才需要看。

现象

在 PowerShell 7 里设了代理,报错从 Cloudflare 挑战页变成了:

Invoke-RestMethod: The proxy tunnel request to proxy 'http://192.168.1.1:7890/' failed with status code '407'.

407 Proxy Authentication Required — 代理要求认证,客户端没带凭据。

这其实是个进展:说明代理连上了,请求真的打到了 7890 端口。

岔路一:你 grep 的可能不是运行配置

第一反应是去 OpenWrt 上找 authentication 段:

grep -nE "authentication|allow-lan|mixed-port" /etc/openclash/config/*.yaml

结果是:

/etc/openclash/config/rbtx_ustx.yaml:1:allow-lan: false
/etc/openclash/config/rbtx_ustx.yaml:21:mixed-port: 7890

没有 authentication,而且 allow-lan: false——按这份配置,mihomo 应该只监听 127.0.0.1,根本不该能从局域网访问。

但实际上:

netstat -lntp | grep 789
tcp  0  0 :::7890  :::*  LISTEN  2101/clash

监听在 :::7890,所有接口。

原因/etc/openclash/config/ 下的是订阅原始配置。OpenClash 会把它和「覆写设置」里的选项合并,生成一份新的运行配置,实际加载的是后者。

确认运行配置的方法:

cat /proc/$(pidof clash)/cmdline | tr '\0' ' '
# /etc/openclash/clash -d /etc/openclash -f /etc/openclash/rbtx_ustx.yaml

-f 后面那个路径才是真正加载的文件。注意它在 /etc/openclash/ 下,不是 /etc/openclash/config/ 下,差一层目录

再 grep 一次:

grep -nE "authentication|allow-lan|mixed-port" /etc/openclash/rbtx_ustx.yaml
# 2:allow-lan: true
# 289:authentication:

找到了。

岔路二:LuCI 界面上没有这个字段的入口

知道了有 authentication 段,接下来想在界面上改掉它。结果翻遍「插件设置」的全部标签页——模式设置、流量控制、DNS 设置、流媒体增强、黑白名单、外部控制、IPv6 设置……都找不到代理认证的字段。

特别注意:「外部控制」页里有一个「管理页面登录密钥」,很容易误认。那个对应 yaml 里的 secret 字段,管的是 9090 端口的 Dashboard,跟 7890 代理端口的认证完全是两回事

定位

直接搜 UCI 配置:

grep -rn "authentication" /etc/config/openclash
# /etc/config/openclash:381:config authentication
# /etc/config/openclash:384:      option password '你的密码'

它以独立的 config authentication 段存在于 UCI 配置里,这个 LuCI 版本没有给它做可视化入口。

解法

uci show openclash | grep -i auth     # 先看清结构
uci delete openclash.@authentication[0]
uci commit openclash
/etc/init.d/openclash restart

验证:

grep -n "authentication" /etc/openclash/rbtx_ustx.yaml
# 无输出即成功

如果你需要保留认证

比如你对外提供代理服务,但希望内网设备免认证。在「配置管理」的自定义覆写脚本(openclash_custom_overwrite.sh)里加:

yq -i '.skip-auth-prefixes = ["192.168.1.0/24"]' "$1"

CIDR 改成你自己的内网段。这样对外仍然需要密码,内网设备直接用。

⚠️ **不要直接改 /etc/openclash/rbtx_ustx.yaml。**下次订阅更新或重启时,OpenClash 会重新合并生成运行配置,你的改动会丢失。所有持久化的修改都要走覆写设置或自定义覆写脚本。

这个坑值不值得填

值得。它本来就埋在那里,只是被 Claude Code 的安装提前引爆了。以后 npm、git、docker、pip 任何一个在内网走代理的工具都会撞上同样的 407,到时候排查一遍更费劲。


五、最重要的一条:先测出口再谈代理

比前面三个坑更重要的是这一条。

在装任何东西之前,先跑这条命令:

irm "https://www.cloudflare.com/cdn-cgi/trace"

输出长这样:

fl=467f193
ip=xx.xx.xx.xx
ts=1787472628.000
uag=Mozilla/5.0 (Windows NT 10.0; ...) PowerShell/7.6.5
colo=SJC
loc=US
tls=TLSv1.3

loc= 那一行:

  • 不是 CN → 你的网络已经通了,什么代理都别配
  • 是 CN → 才需要考虑挂代理

我那天犯的错

我的路由器上 OpenClash 开了 TUN 模式(tun.enable: true + auto-route: true),它是网关,流量在路由器层面就被接管了。对 Windows 来说这是完全透明的——应用程序不知道自己被代理了,也不需要知道。

也就是说,从头到尾我的网络都是好的。

我手动设 HTTPS_PROXY 是在应用层再挂一次代理,多此一举,而且正是这一步引出了 407,以及后面一连串的排查。

如果第一步就跑那条 trace 命令,会立刻看到 loc=US,直接判断出问题不在网络,然后走 winget。三步搞定,不会有后面那一大圈。

判断顺序

1. 跑 cdn-cgi/trace
   ├─ loc ≠ CN → 直接 winget 装,别配代理
   └─ loc = CN → 继续下一步
2. 检查 PowerShell 版本(5.1 不读环境变量)
3. 检查代理是否需要认证(407)
4. 配好代理后再跑一次 trace 确认

六、常见问题

Q:提示 claude 不是 cmdlet

PATH 没生效。先关掉终端重开。还不行的话手动加:

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:USERPROFILE\.local\bin", "User")

winget 装的路径在 C:\Users\你的用户名\AppData\Local\Microsoft\WinGet\Packages\Anthropic.ClaudeCode_*\ 下,正常情况 winget 会自动处理 PATH。

Q:每次启动都要重新登录吗

不会。凭据保存在 C:\Users\你的用户名\.claude\,登录一次就够。只有主动 claude auth logout、凭据过期(很久不用)或者删除 .claude 目录才需要重新登录。

Q:桌面版和命令行版是同一个吗

是。Claude 桌面版顶部有 Home / Code 标签,Code 就是 Claude Code 的图形界面。它和命令行版共用 ~/.claude/ 下的登录状态、settings.json、skills、MCP 配置,配一次两边都认。

区别在使用场景:

  • 命令行:SSH 到远程机器、脚本化调用、CI 环境
  • 桌面版:可视化 diff 审阅、单窗口并行会话

Q:每个项目都要重新配置吗

不用。git config --global 那类全局配置一次就够,所有仓库共用。

Claude Code 这边:~/.claude/ 是全局配置(skills、MCP、登录态),项目根目录的 CLAUDE.md 是项目专属约定。后者可选,用来告诉它这个项目的规矩,每次会话自动加载。

Q:会话之间会记住上下文吗

**不会。**每个会话独立。/exit 退出再进来,上下文就清空了。

两个应对方式:

  • 在会话内用 !命令 执行 shell,不用退出(例如 !git diff
  • claude --continue 接上最近一次会话,或 claude --resume <会话ID> 指定某次

Q:让它改代码前要做什么

git init + 提交一个初始版本。

Claude Code 会直接修改你的文件。有 git 才能 git diff 看它改了什么、git checkout . 一键回退。这一步花不了一分钟,但能省掉很多麻烦。

另外建议:一次只让它做一件事,改完就 commit。不要说”把这 9 个问题都修了”——你会得到一个几百行、自己看不懂的 diff。


小结

正确路径三步:

winget install Git.Git
winget install Anthropic.ClaudeCode
claude auth login

卡住了对照三个坑:

  1. Cloudflare 挑战页 → 用 winget 绕开 claude.ai
  2. 代理设了没反应 → 检查 PowerShell 版本,5.1 不读环境变量
  3. 407 报错 → 代理端开了认证,OpenClash 用户查 /etc/config/openclashconfig authentication

以及最重要的:配代理之前,先跑 cdn-cgi/traceloc=


如果这篇对你有帮助,视频版在【B 站链接】,欢迎三连。

我这边还有一些国际服务注册和网络工具的教程:

  • 【国际手机号注册系列】
  • 【其他相关文章】

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注