code --list-extensions是唯一可靠、无需插件的导出方式,输出纯文本启用插件id列表(如ms-python.python),适配所有平台和vscode 1.80+版本,支持重定向保存为extensions.txt用于跨平台备份与批量安装。

code --list-extensions 是唯一可靠、无需额外插件的导出方式,直接输出纯文本 ID 列表,适配所有平台和 VSCode 版本(1.80+),不依赖网络、不读取禁用状态、不混淆工作区与用户级扩展。
导出插件列表必须用命令行,别碰图形界面
VSCode 界面里点开扩展面板(Ctrl+Shift+X),再手动复制粘贴,极易漏掉带空格或特殊字符的 ID,且无法区分启用/禁用状态。真正可复现的导出只有一条命令:code --list-extensions。它只返回已启用、用户级安装的扩展 ID,格式统一为 publisher.name(如 ms-python.python)。
要存档就加重定向:
-
code --list-extensions > extensions.txt(Linux/macOS/PowerShell) -
code --list-extensions > extensions.txt(Windows CMD,注意路径权限)
生成的 extensions.txt 是纯文本,无 BOM、无注释、无版本号——干净,适合 Git 提交或跨平台传输。
想带版本号?加 --show-versions 但要注意兼容性
code --list-extensions --show-versions 会输出形如 ms-python.python@2024.12.1 的行,看起来更完整,但实际安装时 code --install-extension 不接受带 @ 版本号的参数,会报错 Extension 'xxx@yyy' not found.。
所以除非你后续自己写脚本做版本解析,否则别用这个参数。真需要版本控制,建议用 code --list-extensions 导出基础 ID,再配合 code --install-extension 的 --force 参数确保覆盖旧版,比硬锁版本更稳妥。
批量安装必须逐行执行 code --install-extension
VSCode 不支持 code --install-extension 一次传多个 ID,也不接受 -f 或 --batch 这类参数。任何“一键导入”都只是外壳脚本封装。
Linux/macOS 推荐用:
while read extension; do
code --install-extension "$extension"
done
<p>PowerShell 推荐用:</p>
<pre class="brush:php;toolbar:false;">Get-Content extensions.txt | ForEach-Object { code --install-extension $_ }
关键点:
- 不要用
xargs -I {} code --install-extension {},遇到含空格的 publisher 名会崩(比如bradlc.vscode-tailwindcss没问题,但某些自定义 ID 可能含空格) - 每行执行一次,失败不中断后续;若某插件安装失败(如网络超时、ID 不存在),日志会明确报出
Extension 'xxx' not found,方便排查 - 安装过程不自动重启 VSCode,装完需手动重开或执行
code --reload
settings.json 和插件列表要分开处理
很多人误以为导出插件就等于导出环境,其实 settings.json 里可能藏着绝对路径(比如 "python.defaultInterpreterPath": "/home/user/.pyenv/versions/3.11.5/bin/python"),直接复制到新机器会导致 Python 扩展失效。
迁移前务必检查并清理这些字段:
- 删掉或注释掉所有以
/、C:\开头的路径配置项 - 禁用依赖登录态的插件(如 GitHub Copilot、Tabnine),它们的 token 不会随插件一起导出
-
keybindings.json和snippets/文件夹也要一并备份,但它们不参与插件列表导出流程
最易被忽略的是:插件安装后不会自动启用——如果原机器上某个插件被手动禁用过,code --list-extensions 根本不会列出它,所以你的备份永远只包含“当前启用”的那一部分。需要完整还原,得先在源机器上全选启用再导出。











