在 Remote Codespaces 里启动 Node 项目时遇到脚本执行错误,别着急怀疑环境配置——绝大多数情况下,问题出在 PowerShell 的执行策略上。
终端输出这样的信息:File start.ps1 cannot be loaded because running scripts is disabled on this system。这不是 Node 环境没装好,也不是项目路径配错了——真正的原因,藏在 Codespaces 默认终端(PowerShell)沿用的 Windows Restricted 策略里。这种策略下,连本地生成的包装脚本(比如 node_modules/.bin/npm 实际是 npm.ps1)都会被静默拦截。

为什么 Remote Codespaces 会卡在 PowerShell 策略上
Codespaces 底层虽然是 Linux 容器,但 VSCode 远程终端默认启用了 PowerShell for Linux(通过 powershell-linux),而且策略继承自用户配置。即便容器里没安装 Windows,PowerShell 仍然按照 Restricted 模式启动,导致所有 .ps1 封装脚本无法执行。
- 错误现象很清楚:终端输出包含
cannot be loaded because running scripts is disabled,但node --version却可以正常运作 - 这不是文件权限问题:
chmod +x对.ps1文件完全无效 - 也不是 Codespaces 配置缺失:不需要修改
devcontainer.json或添加sudo - 真正要调整的,是当前用户的 PowerShell 策略上下文
必须执行的三步修复(无须管理员权限)
在 Codespaces 终端中依次运行以下命令:
- 检查当前策略:
Get-ExecutionPolicy -Scope CurrentUser—— 如果返回Restricted,就确认了问题所在 - 放宽策略(仅限当前用户):
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 验证生效:
Get-ExecutionPolicy -Scope CurrentUser应该输出RemoteSigned
完成后,记得关闭所有终端标签页(Ctrl+Shift+` 关掉再重新打开),再试 npm run dev。旧终端不会自动刷新策略,重启是必须的步骤。
Node 项目调试时 launch.json 报 “Cannot launch program”
这个错误经常被误判为路径不对,但实际上调试器启动链被 PowerShell 拦截了——特别是在 launch.json 的 program 字段指向一个 shell 脚本(比如 ./scripts/start.sh)或 npm script 封装入口的时候。
- 安全写法:
"program": "${workspaceFolder}/src/index.js"(直接指向 JS 文件) - 避免写法:
"program": "${workspaceFolder}/start.sh"或"program": "npm"(会触发 PowerShell 执行封装) - 如果必须用脚本启动,改用
console类型任务配合preLaunchTask,绕过调试器直接调用 - Codespaces 中
node_modules/.bin下的二进制本质上是.ps1,所以eslint、ts-node等 CLI 也会因此失败,同样靠上述策略修复
真正容易被忽略的点:Codespaces 的终端策略是 per-user 的,但如果用同一个 GitHub 账号在多个 Codespace 之间切换,策略不会自动同步——每个新空间都要单独执行一次 Set-ExecutionPolicy。别指望一次设置就能永久生效。