博客

  • 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 站链接】,欢迎三连。

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

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

  • 英国手机号注册教程:不需要英国地址、不需要英国身份,一张Visa/Mastercard信用卡搞定

    很多朋友在注册海外平台、银行账户、或者一些需要英国本地验证的服务时,都会遇到需要一个英国手机号的门槛。今天这篇教程就来手把手教大家,如何在不需要英国地址、不需要英国身份证明的情况下,申请一个真实的英国手机号,并且在国内也能正常使用。

    视频版教程已经发布在B站和抖音,文字步骤可以配合视频一起看,遇到卡顿的地方更直观。

    为什么选择 Giffgaff?

    Giffgaff 是英国本土的虚拟运营商(MVNO),依托 O2 网络,是目前申请门槛最低、也最适合海外用户的英国运营商之一:

    • 不需要英国地址(地址栏可以用符合英国邮编格式的地址填写)
    • 不需要英国身份证明(护照、签证、居留证明统统不需要)
    • 只需要一张 Visa 或 Mastercard 信用卡用于身份/账单验证
    • 申请成功后拿到的是真实的英国手机号(+44 开头),可以正常接收短信验证码

    申请步骤

    1. 打开 Giffgaff 官网,选择申请免费 SIM 卡(Free SIM)
    2. 填写基本信息(姓名、邮箱等)
    3. 填写地址信息(符合英国邮编格式即可)
    4. 绑定一张 Visa 或 Mastercard 信用卡完成验证
    5. 提交申请,等待审核通过
    6. 审核通过后,你会拿到一个真实的英国手机号

    具体每一步的界面操作和注意事项,视频里有完整演示,建议对照着看,减少踩坑。

    国内如何使用这个英国号码?

    申请下来的是实体 SIM 卡,但实体卡寄到国内基本用不了。这里就需要借助 eSIM 转换服务,把这张英国实体 SIM 卡搬到你手机的 eSIM 里,国内直接就能用,接收短信验证码完全没问题。

    我自己一直在用的是 xesim,稳定性和到账速度都还不错,这里分享一下我的专属链接和粉丝折扣码:

    下单时记得填上折扣码,可以享受专属优惠。

    常见问题

    Q:这个号码能一直用吗?
    A:只要正常缴费/保持活跃,Giffgaff 号码可以长期使用。

    Q:eSIM 转换后,原来的实体卡还能用吗?
    A:转换成 eSIM 后建议以 eSIM 为准使用,避免两边同时使用导致冲突。

    Q:信用卡验证会扣费吗?
    A:一般只是身份验证用途,具体以 Giffgaff 官方流程为准,注意查看官网最新政策。


    如果这篇教程帮到了你,欢迎点击上面的专属链接支持一下,也可以去B站/抖音看视频版演示,评论区遇到问题欢迎交流~