Claude Code VSCode 扩展 Windows 打开出现 "claude-vscode.editor.openLast"
问题描述
在 Windows 系统上安装 Claude Code VSCode 扩展后,扩展无法正常激活,报错信息如下:
Activating extension 'Anthropic.claude-code' failed:
The argument 'filename' must be a file URL object, file URL string,
or absolute path string. Received 'file:///home/runner/work/...'
问题原因
根本原因
Claude Code 扩展的打包文件 extension.js 中包含两个硬编码的 Linux CI 构建路径:
file:///home/runner/work/claude-cli-internal/claude-cli-internal/build-agent-sdk/sdk.mjs
这是 Anthropic 在 Linux CI/CD 环境中构建扩展时,构建工具将构建时的绝对路径硬编码到了输出文件中。
为什么 Windows 会报错
在 Windows 上,Node.js 的 fileURLToPath() 函数要求文件 URL 必须是有效的 Windows 路径格式(如 file:///C:/Users/...),但这个 Linux 路径没有 Windows 驱动器号,导致 Node.js 拒绝解析并抛出异常。
扩展在激活时立即调用这个路径,因此直接崩溃。
受影响的代码位置
扩展中有两处使用了这个错误路径:
| 位置 | 代码 | 影响 |
|---|---|---|
| Fix 1 | .createRequire("file:///home/runner/.../sdk.mjs") |
扩展激活时立即崩溃 |
| Fix 2 | someFunction("file:///home/runner/.../sdk.mjs") |
调用 Agent SDK 时崩溃 |
解决方案
修复思路
| 修复点 | 原代码 | 修复后 |
|---|---|---|
| Fix 1 | .createRequire("file:///...") |
.createRequire(__filename) - 使用当前文件路径 |
| Fix 2 | someFunc("file:///...") |
内联查找 claude CLI 在 PATH 中的位置 |
使用修复脚本
步骤 1:创建脚本文件
新建一个文件 fix-claude-code-extension.ps1,将以下内容复制进去:
powershell
<#
.SYNOPSIS
修复 Claude Code VSCode 扩展在 Windows 上的激活失败问题
.DESCRIPTION
本脚本用于修复 Claude Code VSCode 扩展在 Windows 系统上无法激活的问题。
问题根源是扩展的 extension.js 文件中包含硬编码的 Linux CI 构建路径,
导致 Windows 上的 Node.js 无法解析该路径,从而抛出异常。
.NOTES
文件名: fix-claude-code-extension.ps1
作者: Claude Code 用户社区
创建时间: 2025-02-24
适用版本: anthropic.claude-code-2.1.51 及其他受影响版本
.EXAMPLE
方式一:右键点击脚本文件,选择"使用 PowerShell 运行"
方式二:在 PowerShell 中执行:
powershell.exe -ExecutionPolicy Bypass -File "fix-claude-code-extension.ps1"
#>
# ============================================
# 错误处理设置
# ============================================
# Stop 表示遇到任何错误立即停止执行,便于定位问题
$ErrorActionPreference = "Stop"
# ============================================
# 全局变量定义
# ============================================
# VSCode 扩展的安装根目录
# %USERPROFILE% 会自动展开为当前用户的主目录,如 C:\Users\用户名
$extensionRoot = "$env:USERPROFILE\.vscode\extensions"
# 错误的 Linux CI 构建路径(这是导致问题的根源)
# 这个路径是 Anthropic 在 Linux CI/CD 环境中构建时被硬编码进去的
# 在 Windows 上,Node.js 的 fileURLToPath() 无法解析这种没有驱动器号的路径
$badUrl = 'file:///home/runner/work/claude-cli-internal/claude-cli-internal/build-agent-sdk/sdk.mjs'
# ============================================
# 正则表达式模式定义
# ============================================
# --- Fix 1: 修复 createRequire 调用 ---
#
# 原代码问题:
# .createRequire("file:///home/runner/.../sdk.mjs")
# 这个调用在扩展激活时立即执行,会直接崩溃
#
# 修复方案:
# .createRequire(__filename)
# 使用 __filename(Node.js 内置变量)获取当前文件的实际路径
# 这是 Node.js 的标准做法,跨平台兼容
#
# 正则说明:
# \.createRequire - 匹配 .createRequire 方法调用
# \( - 匹配左括号
# "file:///..." - 匹配错误的 URL 字符串
# \.mjs - . 需要转义,匹配文件扩展名
$pattern1 = '\.createRequire\("file:///home/runner/work/claude-cli-internal/claude-cli-internal/build-agent-sdk/sdk\.mjs"\)'
$replacement1 = '.createRequire(__filename)'
# --- Fix 2: 修复路径解析函数调用 ---
#
# 原代码问题:
# 某个函数(可能是 fileURLToPath 的包装器)接收这个错误的 URL
# 在调用 Agent SDK 时会崩溃
# 由于代码是压缩的,函数名会被简化成单个字母(如 Ye、Xe 等)
#
# 修复方案:
# 替换为一个内联的立即执行函数(IIFE)
# 该函数会在运行时动态查找 claude CLI 的实际位置
# - Windows: 使用 where.exe 命令查找
# - Linux/Mac: 使用 which 命令查找
#
# 正则说明:
# [a-zA-Z_$] - 匹配变量名起始字符(字母、下划线、美元符号)
# [a-zA-Z0-9_$]* - 匹配变量名剩余字符(可以包含数字)
# \( - 匹配左括号(函数调用)
# "file:///..." - 匹配错误的 URL 字符串
# \) - 匹配右括号
$pattern2 = '[a-zA-Z_$][a-zA-Z0-9_$]*\("file:///home/runner/work/claude-cli-internal/claude-cli-internal/build-agent-sdk/sdk\.mjs"\)'
# 替换为一个立即执行函数,动态查找 claude CLI 的位置
# 函数逻辑:
# 1. 判断操作系统:process.platform === "win32" ? "where.exe" : "which"
# 2. 使用 spawnSync 同步执行查找命令
# 3. 获取 stdout 输出
# 4. 按换行符分割,过滤空行,取第一个结果
# 5. 如果出错返回 undefined
$replacement2 = '(function(){try{return(require("child_process").spawnSync(process.platform==="win32"?"where.exe":"which",["claude"],{encoding:"utf8"}).stdout||"").split(/[\r\n]+/).filter(Boolean)[0]}catch(e){}})()'
# ============================================
# 主逻辑:查找并修复扩展
# ============================================
# 检查 VSCode 扩展目录是否存在
if (-not (Test-Path $extensionRoot)) {
Write-Host "VSCode 扩展目录不存在: $extensionRoot" -ForegroundColor Red
Write-Host "请确认 VSCode 已正确安装" -ForegroundColor Yellow
exit 1
}
# 查找所有 Claude Code 扩展目录
# 使用通配符 anthropic.claude-code-* 匹配不同版本
Write-Host "正在搜索 Claude Code 扩展..." -ForegroundColor Cyan
$dirs = Get-ChildItem $extensionRoot -Directory | Where-Object { $_.Name -like 'anthropic.claude-code-*' }
# 检查是否找到扩展
if ($dirs.Count -eq 0) {
Write-Host "未找到 Claude Code 扩展: $extensionRoot" -ForegroundColor Yellow
Write-Host "请确认已安装 Claude Code 扩展" -ForegroundColor Yellow
exit 1
}
Write-Host "找到 $($dirs.Count) 个 Claude Code 扩展" -ForegroundColor Green
Write-Host ""
# ============================================
# 遍历每个扩展目录进行修复
# ============================================
foreach ($dir in $dirs) {
# 获取扩展目录名(包含版本号)
$label = $dir.Name
# 构建 extension.js 文件的完整路径
$file = Join-Path $dir.FullName 'extension.js'
Write-Host "========================================" -ForegroundColor White
Write-Host "正在处理: $label" -ForegroundColor White
Write-Host "========================================" -ForegroundColor White
# 检查 extension.js 文件是否存在
if (-not (Test-Path $file)) {
Write-Host "[警告] extension.js 文件不存在,跳过此扩展" -ForegroundColor Yellow
Write-Host ""
continue
}
# 读取文件内容(使用 UTF-8 编码确保正确处理)
Write-Host "[1/6] 读取 extension.js 文件..." -ForegroundColor Cyan
$content = [System.IO.File]::ReadAllText($file, [System.Text.Encoding]::UTF8)
# 检查文件中是否包含错误的 URL
if ($content.IndexOf($badUrl) -lt 0) {
Write-Host "[跳过] 此扩展未受影响(未发现错误的 CI 路径)" -ForegroundColor Green
Write-Host "可能原因:已修复过,或者是新版本已解决此问题" -ForegroundColor Gray
Write-Host ""
continue
}
# 统计错误 URL 出现的次数
$count = ([regex]::Matches($content, [regex]::Escape($badUrl))).Count
Write-Host "[2/6] 发现 $count 处错误的 CI 路径,开始修复..." -ForegroundColor Cyan
# --- 创建备份文件 ---
# 备份文件名:extension.js.bak
# 如果修复后出现问题,可以通过恢复备份来回滚
$backup = "$file.bak"
Write-Host "[3/6] 创建备份文件: extension.js.bak" -ForegroundColor Cyan
# 如果备份文件已存在,先删除(避免重复运行时的冲突)
if (Test-Path $backup) {
Remove-Item $backup -Force
Write-Host " 已删除旧的备份文件" -ForegroundColor Gray
}
# 复制原文件作为备份
Copy-Item $file $backup
Write-Host " 备份创建成功" -ForegroundColor Green
# --- 应用 Fix 1: 修复 createRequire 调用 ---
Write-Host "[4/6] 应用修复 1: 修复 createRequire 调用..." -ForegroundColor Cyan
# 使用正则表达式替换
$patched = [regex]::Replace($content, $pattern1, $replacement1)
# 计算此步骤修复了多少处
$remainingAfterFix1 = ([regex]::Matches($patched, [regex]::Escape($badUrl))).Count
$fix1count = $count - $remainingAfterFix1
Write-Host " 已替换 $fix1count 处 createRequire 调用" -ForegroundColor Green
# --- 应用 Fix 2: 修复路径解析函数调用 ---
Write-Host "[5/6] 应用修复 2: 修复路径解析函数调用..." -ForegroundColor Cyan
# 使用正则表达式替换
$patched2 = [regex]::Replace($patched, $pattern2, $replacement2)
# 计算此步骤修复了多少处
$remainingAfterFix2 = ([regex]::Matches($patched2, [regex]::Escape($badUrl))).Count
$fix2count = $remainingAfterFix1 - $remainingAfterFix2
Write-Host " 已替换 $fix2count 处路径解析函数调用" -ForegroundColor Green
# --- 验证修复结果 ---
Write-Host "[6/6] 验证修复结果..." -ForegroundColor Cyan
if ($remainingAfterFix2 -gt 0) {
# 如果还有剩余的错误 URL,说明可能有新的模式需要处理
Write-Host "[警告] 仍有 $remainingAfterFix2 处错误路径未修复!" -ForegroundColor Yellow
Write-Host "这可能意味着扩展版本有变化,脚本需要更新" -ForegroundColor Yellow
} else {
Write-Host " 所有错误路径已成功修复" -ForegroundColor Green
}
# --- 写入修复后的文件 ---
[System.IO.File]::WriteAllText($file, $patched2, [System.Text.Encoding]::UTF8)
Write-Host ""
Write-Host "[完成] $label 修复成功!" -ForegroundColor Green
Write-Host ""
}
# ============================================
# 完成提示
# ============================================
Write-Host "========================================" -ForegroundColor White
Write-Host "修复完成!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor White
Write-Host ""
Write-Host "请在 VSCode 中重新加载窗口以应用修复:" -ForegroundColor White
Write-Host " 1. 按 Ctrl + Shift + P 打开命令面板" -ForegroundColor Gray
Write-Host " 2. 输入 'Developer: Reload Window'" -ForegroundColor Gray
Write-Host " 3. 回车执行" -ForegroundColor Gray
Write-Host ""
Write-Host "如需回滚,请将 extension.js.bak 重命名为 extension.js" -ForegroundColor Yellow
Write-Host ""
步骤 2:执行脚本
在 PowerShell 中执行:
powershell
powershell.exe -ExecutionPolicy Bypass -File "fix-claude-code-extension.ps1"
或者右键点击脚本文件,选择"使用 PowerShell 运行"。
步骤 3:重新加载 VSCode
- 按
Ctrl + Shift + P打开命令面板 - 输入
Developer: Reload Window - 回车执行
执行结果示例
正在搜索 Claude Code 扩展...
找到 1 个 Claude Code 扩展
========================================
正在处理: anthropic.claude-code-2.1.51-win32-x64
========================================
[1/6] 读取 extension.js 文件...
[2/6] 发现 2 处错误的 CI 路径,开始修复...
[3/6] 创建备份文件: extension.js.bak
备份创建成功
[4/6] 应用修复 1: 修复 createRequire 调用...
已替换 1 处 createRequire 调用
[5/6] 应用修复 2: 修复路径解析函数调用...
已替换 1 处路径解析函数调用
[6/6] 验证修复结果...
所有错误路径已成功修复
[完成] anthropic.claude-code-2.1.51-win32-x64 修复成功!
========================================
修复完成!
========================================
请在 VSCode 中重新加载窗口以应用修复:
1. 按 Ctrl + Shift + P 打开命令面板
2. 输入 'Developer: Reload Window'
3. 回车执行
或者直接关闭了,再打开!!
如需回滚,请将 extension.js.bak 重命名为 extension.js
回滚方法
如果修复后出现问题,可以恢复原始文件:
-
进入扩展目录:
%USERPROFILE%\.vscode\extensions\anthropic.claude-code-{version}-win32-x64\ -
删除
extension.js -
将
extension.js.bak重命名为extension.js -
重新加载 VSCode
注意事项
-
扩展更新后可能需要重新修复:如果 Anthropic 发布新版本扩展但没有修复这个问题,需要重新运行脚本
-
官方修复:此问题是 Anthropic 构建流程的问题,等待官方修复后就不需要这个脚本了
-
验证修复成功:重新加载 VSCode 后,查看扩展是否正常激活,状态栏是否显示 Claude Code 图标
文档创建时间:2025-02-24
适用版本 :anthropic.claude-code-2.1.51
解决方案出处: https://github.com/anthropics/claude-code/issues/28076