环境: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 启动时会扫描当前目录建立上下文,默认也只能读写这个目录树内的文件。在空文件夹里起会话,它什么都看不见。
第一次进入会有初始化向导:
- 选择配色主题(可以后面用
/theme改) - 选择账号类型(Pro/Max/Team/Enterprise 选第一项)
- 安全提示(回车继续)
- 确认信任当前文件夹
这些步骤没有一个是不可逆的,全都能在会话里用 /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_opt、cType: 'managed'、cZone: 'claude.ai'。
原因
这是 Cloudflare 的 managed challenge。它要求客户端执行一段 JavaScript 来证明自己是浏览器,通过之后才放行。
Invoke-RestMethod(irm)只是一个 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
ProxyEnable 为 1 说明系统代理是开的。这会影响 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
卡住了对照三个坑:
- Cloudflare 挑战页 → 用 winget 绕开 claude.ai
- 代理设了没反应 → 检查 PowerShell 版本,5.1 不读环境变量
- 407 报错 → 代理端开了认证,OpenClash 用户查
/etc/config/openclash的config authentication段
以及最重要的:配代理之前,先跑 cdn-cgi/trace 看 loc=。
如果这篇对你有帮助,视频版在【B 站链接】,欢迎三连。
我这边还有一些国际服务注册和网络工具的教程:
- 【国际手机号注册系列】
- 【其他相关文章】