如果你從來沒用過終端機,這篇可以照著做完。Claude Code(一套在命令列裡運作的AI編碼工具)本身不難裝,真正讓人停下來的是後面那一步:程式裝好了、版本號也印得出來,一啟動卻被回一句403。以下按「先弄懂名詞、再動手安裝、最後確認裝好」的順序走。
環境以Windows 10/11與Windows PowerShell為例。文中
YOUR_OWN_API_KEY、MODEL_ID_HERE都是佔位符,請換成你自己建立的值。

同一個視窗裡,查版本成功、啟動被拒——這張圖就是本文要解釋的落差。
新手最常把這幾樣東西混成一樣,然後對著一個錯誤訊息亂改。先把角色分清楚:
| 名詞 | 它的角色 | 這篇拿它做什麼 |
|---|---|---|
| Claude Code | 裝在你電腦上的命令列工具 | 安裝它,讓claude這道命令能執行 |
| Node.js | 讓npm安裝方式可以運作的執行環境 | 走npm路線時才需要 |
| Base URL | 用戶端要把請求送往哪個根網址 | 指向Crazyrouter |
| API Key | 向服務端證明身分的一串憑證 | 寫進設定檔 |
這裡先記住一句:Claude Code自身不含模型。把它裝好,不代表你已經有可用的模型額度,這兩件事要分開準備。
在開始功能表搜尋PowerShell開啟,或在Windows Terminal裡新增一個PowerShell索引標籤。畫面出現PS C:\Users\你的使用者名稱>這類提示字元,就是命令要輸入的地方;提示字元本身不必複製,只複製程式碼區塊裡的內容,一次一行。
若你正停在Claude Code的交談畫面,請先離開回到普通視窗——安裝指令不是聊天內容,貼給模型沒有作用。
路線A:官方原生指令碼
irm https://claude.ai/install.ps1 | iex
下指令前確認網域是claude.ai。原生安裝不要求先有Node.js,所以「沒裝Node.js就裝不起來」這句話只適用於路線B。安裝完成後依提示處理PATH,必要時關掉視窗重開,再驗證一次:
claude --version
路線B:npm套件
先從Node.js官網下載頁取得Windows的LTS安裝檔,依精靈裝好後重開終端機。目前文件要求Node.js 22以上,舊教學裡的版本別沿用。
node --version
npm.cmd --version
npm.cmd install -g @anthropic-ai/claude-code
claude.cmd --version
套件名稱結尾是claude-code,-g和套件名稱中間有一個空格。這裡寫成npm.cmd與claude.cmd是刻意的:npm會同時產生.cmd與.ps1兩個包裝檔,PowerShell有時會挑到.ps1,而它可能被執行原則擋下,指定.cmd等於走命令解譯器那條路。

滿屏紅字裡出現var、<script type="text/javascript">,這些都是JavaScript與HTML的語法。這不是PowerShell故障,而是它被餵了一份網頁原始碼去讀。這通常代表你下載到的不是指令碼,而是被攔截後回傳的頁面。路線A到這裡就停,改走路線B。

若錯誤是E404,請把訊息裡的套件名稱逐字讀完。圖中是@anthropic-ai/claude-codenpm,尾巴多掛了npm,因為上一行和這一行黏在同一行了。這跟網路或鏡像來源都無關,清空重打即可。
補充一點:依本次查到的文件,Windows版在沒有Git for Windows的情況下也能透過PowerShell執行Shell指令,需要拉倉庫、管版本時再安裝即可,不必當成前置條件。
用瀏覽器開啟https://crazyrouter.com完成註冊與登入,進入主控台找到金鑰頁面,新建一把Key。名稱取一個日後認得出來的,例如claude-code-windows,順便確認有效期限、額度與可用的模型範圍,再把Key複製保存——離開頁面後通常就看不完整了。
登入密碼、信箱驗證碼與API Key是三樣不同的東西,Claude Code只認最後一個。
使用者層級的設定檔對任何目錄啟動的Claude Code都生效,路徑是:
%USERPROFILE%\.claude\settings.json
先確認目錄存在,並替可能已有的舊設定留一份備份:
$cfgDir = "$env:USERPROFILE\.claude"
if (-not (Test-Path $cfgDir)) { New-Item -ItemType Directory $cfgDir | Out-Null }
$profileFile = "$cfgDir\settings.json"
if (Test-Path $profileFile) {
Copy-Item $profileFile "$profileFile.old-$(Get-Date -f yyyyMMddHHmmss)"
}
notepad $profileFile
把下面內容填進去。檔案不存在就新建;存檔時確認副檔名是.json,別留成settings.json.txt。
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_OWN_API_KEY"
}
}
填寫時有三處最容易出錯:欄位名稱、網址與金鑰一律用英文雙引號;//這種註解不能出現;最後一個欄位後面不能有逗號。原本已經有env的,補在同一層就好,別產生第二個env。
另外,ANTHROPIC_BASE_URL只填根網址https://cn.crazyrouter.com,不要把/v1或/v1/messages一起寫進去。OpenAI相容用戶端的習慣剛好相反,照抄會讓實際請求變成/v1/v1/messages,換來一個404。機器呼叫的網址不要帶UTM參數。
這是整個安裝過程中最關鍵的一個欄位。兩個變數送出的請求標頭不同:
| 變數 | 送出的請求標頭 | 適用對象 |
|---|---|---|
ANTHROPIC_API_KEY |
x-api-key: <你的金鑰> |
Anthropic官方API |
ANTHROPIC_AUTH_TOKEN |
Authorization: Bearer <你的權杖> |
自訂或相容閘道 |
寫成ANTHROPIC_API_KEY,等於告訴用戶端「我手上是官方金鑰」,它會繼續走官方通道,此時ANTHROPIC_BASE_URL填得再正確也拉不回來。這正是「位址明明改了、卻一直403」的成因。兩把憑證不必為了保險同時放進去。
想確認設定檔讀得進來,可以執行:
$cfg = Get-Content "$env:USERPROFILE\.claude\settings.json" -Raw | ConvertFrom-Json
Write-Host "Base :" $cfg.env.ANTHROPIC_BASE_URL
Write-Host "Token:" (-not [string]::IsNullOrWhiteSpace([string]$cfg.env.ANTHROPIC_AUTH_TOKEN))
兩行都有輸出,只代表語法正確,不代表金鑰有效。也別把整個$cfg印出來截圖,那會讓真實金鑰出現在畫面上。
先取回目前金鑰可用的模型清單:
$apiRoot = ([string]$cfg.env.ANTHROPIC_BASE_URL).TrimEnd('/')
$headers = @{ Authorization = "Bearer $($cfg.env.ANTHROPIC_AUTH_TOKEN)" }
$available = Invoke-RestMethod -Uri "$apiRoot/v1/models" -Headers $headers -Method Get
$available.data | Select-Object id
從回傳的ID裡挑一個,直接複製介面給的字串,不要拿行銷名稱或舊截圖上的名字充當ID。接著把model欄位補進同一份設定(記得在env的收尾大括號後面補上逗號):
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_OWN_API_KEY"
},
"model": "MODEL_ID_HERE"
}
存檔後離開舊工作階段,重新開啟終端機。
先在個人目錄下建一個練習資料夾,別拿真實專案開刀:
$labDir = Join-Path $env:USERPROFILE 'cc-lab'
New-Item -ItemType Directory -Path $labDir -Force | Out-Null
Set-Location -LiteralPath $labDir
claude -p "請只回我OK,不要讀檔、也不要執行指令。"
若你是走npm路線裝的,指令中的claude請代換成claude.cmd,預期得到一個乾淨的OK。之後回主控台的使用日誌,依時間與金鑰名稱篩選,核對這次呼叫:時間吻合嗎、模型是你選的那個嗎、有請求紀錄與用量嗎。用戶端有回應加上後台有紀錄,才算接通。
想親手送一次請求也可以:
$payload = @{
model = 'claude-fable-5-1'
max_tokens = 32
messages = @(@{ role = 'user'; content = 'Reply with exactly OK.' })
} | ConvertTo-Json -Depth 6
Invoke-RestMethod -Uri "$apiRoot/v1/messages" -Method Post -Headers $headers `
-ContentType 'application/json' -Body $payload
這次實測量到的數字如下:
| 這一輪量到什麼 | 數值 |
|---|---|
| 作業系統與殼層 | Windows 10、Windows PowerShell |
| 執行環境版本 | Node.js v22.22.2、npm 10.9.7 |
| Claude Code版本 | 2.1.281 |
| 設定檔狀態 | 讀取成功,只放ANTHROPIC_AUTH_TOKEN |
| 模型清單端點 | HTTP 200,列出161個ID |
| 對話端點 | HTTP 200,回傳OK,stop_reason=end_turn |
| 回應ID | msg_011CfVJqbN2DVuqoYqgLcdNE |
| 權杖用量 | 輸入18、輸出4 |
| 單次往返 | 直送11569 ms、經用戶端5103 ms |
| 用戶端判定 | exit 0、is_error=false、subtype=success |
| 工作階段ID | a7a76f08-fa36-4a36-8787-3f2b24dad626 |
測試用的是隔離的設定目錄,憑證只透過行程環境傳入,所以它證明的是「這套設定在當時能通」。模型ID與價格會隨通路調整,以你查詢當下的/v1/models與主控台為準。
claude --version當成安裝完成的證明。 它只說明命令存在,不代表能接通模型。ANTHROPIC_BASE_URL多寫了一段/v1。 這是最容易被OpenAI習慣帶偏的地方,會直接換來404。標籤:ClaudeCode, Windows, 新手教學, Crazyrouter
免責聲明:以下內容為個人安裝與除錯紀錄,並非官方文件。第三方服務、模型代號、費率與可用模型隨時可能調整,請以官方頁面與你自己的主控台為準;API端點與設定檔位置請依查看當下的官方說明。本文未收取任何推薦費、抽成或贊助。