唯一可靠方式是用code --list-extensions > extensions.txt导出纯文本插件id列表(如ms-python.python),再按平台生成code --install-extension命令脚本;禁用插件不出现,不可加--show-versions,settings.json等配置须单独覆盖而非写入脚本。

直接导出所有配置项生成可执行安装脚本,本质是两件事:导出插件列表 + 生成带 code --install-extension 的命令行;settings.json 等配置文件不能也不该塞进脚本里执行,它得靠覆盖写入。
用 code --list-extensions 导出插件 ID 列表才是唯一可靠起点
VSCode 不把插件名存进 settings.json,UI 里看到的“Python”“Prettier”只是显示名,真实安装 ID 是 ms-python.python 这种格式。手动抄、截图、右键复制都容易错,尤其含大小写或点号时。
-
code --list-extensions输出纯文本、每行一个 ID、无 BOM、无版本号,天然适配后续安装 - 加
--show-versions会输出ms-python.python@2024.6.0,但code --install-extension不认@后面的部分,直接报错Extension 'xxx@yyy' not found - 禁用的插件默认不出现——这是设计行为,不是漏了;真要记录禁用状态,得进
~/.vscode/extensions/手动查,但重装时基本不需要 - Windows 用户若提示
command not found,先在 VSCode 里按Ctrl+Shift+P→ 输入Shell Command: Install 'code' command in PATH回车启用
生成安装脚本必须区分平台,别硬套 Linux 命令到 PowerShell
macOS/Linux 的 xargs -I {} 和 PowerShell 的管道处理逻辑不同,直接混用会导致整行当一个插件名、空格截断、引号逃逸失败。
- macOS/Linux 推荐:
cat extensions.txt | xargs -L 1 code --install-extension --force(-L 1保证每行一个调用,--force跳过“已存在”中断) - PowerShell 必须用:
Get-Content extensions.txt | ForEach-Object { code --install-extension $_ --force },不能用cat或xargs - 统一稳妥法:先
code --list-extensions > extensions.txt导出纯文本,再用 Python/sed/甚至 Excel 生成脚本,绕开 shell 差异 - 网络不稳定时,单个插件卡住会阻塞整个流程;Linux 可加
timeout 120,PowerShell 得自己包try/catch
settings.json 不能也不该放进安装脚本里执行
脚本是为“安装插件”服务的,而 settings.json 是静态配置文件,直接写进脚本里 echo 出来再重定向,既难维护又易出错——路径硬编码、JSON 格式错乱、BOM 导致解析失败,都是常见翻车点。
- 正确做法:把
settings.json、keybindings.json、snippets/单独打包,和extensions.txt放一起,恢复时用cp或robocopy覆盖目标目录 - 注意路径字段:
python.defaultInterpreterPath、terminal.integrated.profiles.windows这类含绝对路径或平台特有键的,迁移前必须删掉或替换成占位符,否则插件启动就报错 - VSCode 1.86+ 引入 Profile 后,
settings.json可能含"profiles": { "my-dev": { ... } }结构;直接全量覆盖会破坏 Profile 根对象,应只提取对应 profile 下的内容粘贴 - 覆盖后必须完全退出 VSCode(任务管理器确认无
Code Helper进程),再启动才生效;仅Developer: Reload Window不触发 Profile 重解析
最常被忽略的是:脚本只管装插件,不管插件依赖。比如 ms-python.python 装完不会自动帮你装 Python 解释器,esbenp.prettier-vscode 也不会自动 npm install -g prettier。这些前置条件得在脚本外单独检查或文档注明。











