Claude Code 启动报「因为在此系统上禁止运行脚本」:PowerShell ExecutionPolicy 与 Node.js 环境排查指南

发布时间:2026/10/7 19:28:10
Claude Code 启动报「因为在此系统上禁止运行脚本」:PowerShell ExecutionPolicy 与 Node.js 环境排查指南 1. Claude Code 启动报「禁止运行脚本」到底卡在哪你在 Windows 上装好 Node.js用 npm 全局装了 Claude Code满心期待敲下claude结果 PowerShell 甩回来一句claude : 无法加载文件 D:\dev\nodejs\claude.ps1因为在此系统上禁止运行脚本。 有关详细信息请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 CategoryInfo : SecurityError: (:) []PSSecurityException FullyQualifiedErrorId : UnauthorizedAccess更让人抓狂的是同样的命令用 Win R 打开 CMD 敲就正常偏偏在桌面右键「在终端中打开」就报错。这不是 Claude Code 坏了也不是 Node.js 装错了而是PowerShell 的执行策略ExecutionPolicy在拦你。先把概念讲清楚。PowerShell 为了防止你无意中运行恶意脚本内置了一套「执行策略」开关。它管的是.ps1脚本文件能不能跑而不是管某个 exe。npm 在全局安装命令行工具时会在 Node.js 的安装目录比如D:\dev\nodejs\里生成三个配套文件claude给 Git Bash / WSL 用、claude.cmd给 CMD 用、claude.ps1给 PowerShell 用。当你在 PowerShell 里敲claude它优先匹配到的是claude.ps1于是执行策略一拦就报了「禁止运行脚本」。而 CMD 走的是claude.cmd.cmd批处理不受 PowerShell 执行策略管辖所以同样的工具在 CMD 里畅通无阻。这就是「换个终端就正常」的真正原因——不是玄学是两条完全不同的加载路径。这篇内容适合三类人刚在 Windows 上装完 Claude Code 或 Codex 这类 Node.js CLI 工具的新手被PSSecurityException反复劝退、每次都要手动绕过的开发者以及想搞清楚 ExecutionPolicy 作用域、不想把系统安全策略一刀切放宽的谨慎派。我会从策略检查、作用域调整、Node.js 路径确认、终端权限四个角度带你定位根因给出可直接复制的命令最后用一次真实请求验证 Claude Code 是否恢复可用。全程不需要重装任何东西改一个策略作用域就能解决。2. 动手前先搞懂 ExecutionPolicy 与 Node.js 路径在改任何东西之前先花两分钟把现状摸清楚否则你可能会在错误的方向上折腾半天。这一节的核心是确认当前策略是什么、确认 Node.js 全局目录在哪、确认你用的是哪个终端。三件事都清楚了根因自然浮出水面。2.1 用 Get-ExecutionPolicy 看清当前策略打开那个会报错的 PowerShell 窗口比如桌面右键「在终端中打开」敲Get-ExecutionPolicy -List你会看到类似这样的输出Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine Restricted这里的关键是LocalMachine那一行。Windows 默认把本机策略设成Restricted——不允许运行任何脚本。而CurrentUser、Process都是Undefined意味着它们没有覆盖本机策略于是最终生效的就是Restricted。PowerShell 的策略优先级从高到低是MachinePolicyUserPolicyProcessCurrentUserLocalMachine。高优先级的如果没设置Undefined就往下找直到找到一个有值的。所以哪怕你只想临时放行也得知道改哪一层最合适。再敲一个不带参数的Get-ExecutionPolicy它返回的是「最终生效」的那一个通常就是Restricted。看到这个报错原因就实锤了。2.2 确认 Node.js 全局目录与 claude.ps1 位置报错信息里已经告诉你了D:\dev\nodejs\claude.ps1。这个路径就是你的 Node.js 安装目录。用命令再确认一遍where.exe node where.exe claudewhere.exe node会输出D:\dev\nodejs\node.exewhere.exe claude会列出所有匹配项通常包括D:\dev\nodejs\claude D:\dev\nodejs\claude.cmd D:\dev\nodejs\claude.ps1看到没三个文件并存。PowerShell 优先选.ps1CMD 选.cmd。如果你把 Node.js 装在C:\Program Files\nodejs\路径会不一样但逻辑相同。确认这个目录的意义在于后面调整策略时你要确保改的是当前用户作用域而不是去动系统目录的权限。顺便看一眼 npm 全局前缀确认工具确实装在这npm config get prefix输出应该和where.exe claude的目录一致。如果不一致说明你可能装了两份 Node.js或者环境变量 PATH 里有多个 node 目录那就要先理清 PATH 顺序否则改了策略还是可能加载到旧的那份。2.3 为什么 CMD 正常、PowerShell 报错把上面两点串起来就明白了。CMD 执行claude时按 PATHEXT 顺序找可执行文件.cmd在列直接跑批处理跟 PowerShell 策略毫无关系。PowerShell 执行claude时先找.ps1找到后要过执行策略这一关Restricted直接拒绝。所以「右键在终端中打开」和「Win R 敲 cmd」的差异本质是终端类型差异不是权限差异也不是用户差异。理解这一点你就不会再去怀疑「是不是管理员权限不够」——其实跟管理员权限一点关系都没有普通用户改CurrentUser作用域就够了。提示如果你在 VS Code 里用集成终端默认也可能是 PowerShell同样会踩这个坑。判断方法很简单看终端提示符前面有没有PS字样。3. 按作用域调整策略的可复制配置搞清楚根因后解决就简单了。核心思路是在合适的作用域把 ExecutionPolicy 设成 RemoteSigned。RemoteSigned的含义是本地创建的脚本可以直接跑从网络下载的脚本必须有数字签名。对 npm 生成的本地.ps1来说它属于本地文件所以能正常执行安全性也够。3.1 临时方案Set-ExecutionPolicy -Scope Process如果你只是想当前这个窗口能用关掉就恢复原样用这条Set-ExecutionPolicy RemoteSigned -Scope ProcessProcess作用域只影响当前 PowerShell 进程窗口一关就失效不会在系统里留下任何持久改动。适合临时调试、借别人电脑用一下的场景。执行后不会有输出直接生效。再敲Get-ExecutionPolicy会返回RemoteSigned。这个方案的好处是零风险、零残留坏处是每开一个新窗口都得重敲一遍。如果你天天用 Claude Code显然不够。3.2 长期方案Set-ExecutionPolicy -Scope CurrentUser推荐用这条一劳永逸且不影响系统其他用户Set-ExecutionPolicy RemoteSigned -Scope CurrentUser执行时 PowerShell 可能会弹一句确认执行策略更改 执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险…… 是否要更改执行策略? [Y] 是 [A] 全是 [N] 否 [L] 全否 [S] 暂停 [?] 帮助 (默认值为“N”):敲Y回车即可。这条命令把当前用户的策略设为RemoteSigned优先级高于LocalMachine的Restricted所以之后所有该用户开的 PowerShell 窗口都生效包括桌面右键「在终端中打开」和 VS Code 集成终端。改完再验证一次Get-ExecutionPolicy -List你应该看到CurrentUser那一行变成了RemoteSigned而LocalMachine仍是Restricted。最终Get-ExecutionPolicy返回RemoteSigned。3.3 用 settings.json 固化 Claude Code 配置策略通了只是第一步Claude Code 要真正跑起来还得连上模型服务。这里给一份可复制的配置片段。Claude Code 读取的是用户目录下的配置文件Windows 路径通常是C:\Users\你的用户名\.claude\settings.json。如果你用 TaoToken 作为接入点配置长这样{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }三个字段缺一不可ANTHROPIC_BASE_URL指向接口地址ANTHROPIC_AUTH_TOKEN填你在控制台生成的密钥ANTHROPIC_MODEL指定要调用的模型 ID。密钥去 https://taotoken.net/api-keys 生成模型 ID 以文档 https://taotoken.net/doc 里的最新列表为准。如果你用的是 Codex它读的是~/.codex/auth.json结构不同{ OPENAI_API_KEY: sk-你的TaoToken密钥, OPENAI_BASE_URL: https://taotoken.net/api }同样三件套Base URL、Key、Model ID。Model ID 在 Codex 里通过启动参数或配置指定别漏。注意配置文件里的密钥不要提交到 Git 仓库也不要在截图里露出。建议单独放在用户目录权限设为仅自己可读。3.4 重启终端并确认策略持久化改完策略和配置后必须关掉所有已打开的 PowerShell 窗口重新开。因为Process作用域的策略是进程级的老窗口不会自动刷新即使是CurrentUser已经加载的会话也可能缓存了旧值。重开一个窗口敲Get-ExecutionPolicy返回RemoteSigned就说明持久化成功。这一步别偷懒很多人改完不重启以为没生效其实是老窗口在骗你。4. 验证请求重新运行 Claude Code 并确认成功策略和配置都就位后进入验证环节。这一节的目标是用一次真实的模型请求证明 Claude Code 不只是能启动而是能正常对话。4.1 重新运行 claude 命令在新开的 PowerShell 窗口里直接敲claude如果之前报的无法加载文件 ... claude.ps1消失了取而代之的是 Claude Code 的交互界面说明执行策略这一关过了。你会看到类似欢迎信息和输入提示符。如果它提示你登录或配置说明配置文件没被读到。检查C:\Users\你的用户名\.claude\settings.json是否存在、JSON 格式是否合法可以用Get-Content看一眼或者用在线 JSON 校验。路径里的用户名别写错中文用户名有时会有编码问题建议确认目录真实存在。4.2 发一条测试消息确认模型连通进入交互界面后输入一句简单的话比如用一句话解释什么是执行策略回车后观察返回。如果几秒内出现模型生成的回答说明 Base URL、Key、Model ID 三件套全部正确链路通了。如果卡住不动或报错往下看第 5 节的排障。你也可以用非交互方式快速验证避免进界面claude -p 回复 ok-p是 print 模式直接把结果打到终端。返回ok或类似内容就证明整条链路可用。这种方式特别适合写进脚本做健康检查。4.3 确认 Node.js 版本满足要求Claude Code 对 Node.js 版本有要求太老的版本可能跑不起来。查一下node -v npm -v建议 Node.js 18 以上20 LTS 更稳。如果版本过低去 Node.js 官网下新的 LTS 安装包覆盖安装装完重开终端再试。注意覆盖安装后全局 npm 包有时需要重装npm install -g anthropic-ai/claude-code装完再where.exe claude确认路径没变。4.4 用模型对话页面交叉验证密钥如果你怀疑是密钥本身的问题可以先去 https://taotoken.net/models 用网页版模型对话发一条消息。网页能通、本地不通问题就在本地配置或网络网页也不通那就是密钥或额度的问题。这种交叉验证能帮你快速缩小范围避免在错误的方向上改配置。5. 本篇常见错误排查对照表即使按步骤走也可能遇到别的报错。这一节把高频问题和真实报错对照起来方便你对号入座。5.1 仍然报「禁止运行脚本」如果重启终端后还报同样的错先确认你改的是不是当前用户whoami Get-ExecutionPolicy -List看CurrentUser那行是不是RemoteSigned。如果还是Undefined说明命令没执行成功可能被组策略覆盖了。检查MachinePolicy和UserPolicy如果这两项有值且是Restricted那它们优先级更高你改CurrentUser也没用。这种情况多见于公司统一管理的电脑需要联系 IT个人电脑一般不会。还有一种可能你改完没重开窗口。老窗口的Process作用域可能还是旧值务必关掉重开。5.2 401 报错密钥无效或未生效启动成功但发消息返回 401通常是密钥问题。报错长这样API Error: 401 Unauthorized排查顺序第一确认ANTHROPIC_AUTH_TOKEN填的是完整密钥没有多余空格或换行第二确认密钥没过期、没被删除去 https://taotoken.net/api-keys 核对第三确认 Base URL 是https://taotoken.net/api末尾不要多加斜杠或路径。JSON 里字符串要用英文双引号中文引号会导致解析失败。5.3 local proxy failed本地代理或网络问题报错里出现local proxy failed或连接超时多半是网络层的问题。先确认你的网络能正常访问外网再检查系统代理设置是否干扰了请求。如果你在公司内网可能有防火墙拦截换一个网络环境试试。注意这里说的是正常的网络连通性排查不涉及任何特殊网络工具。5.4 reading choices 报错响应格式异常如果报错提到reading choices或解析响应失败通常是 Base URL 指向了不兼容的接口或者模型 ID 写错了。确认ANTHROPIC_MODEL用的是文档里列出的有效 ID别自己拼。Base URL 必须是https://taotoken.net/api不要写成网页地址。5.5 OAuth 相关报错如果提示 OAuth 登录失败或 token 刷新异常说明你可能混用了官方登录和自定义 Base URL。用自定义接入点时应该走 API Key 模式不要触发 OAuth 流程。检查配置文件里是否同时存在冲突的字段清掉多余的登录态缓存通常在~/.claude/下的凭证文件只保留settings.json里的三件套。5.6 CC Switch / Cline MCP / Codex auth.json 配置要点如果你用 CC Switch 管理多个接入点或者通过 Cline 的 MCP 接 Claude Code又或者用 Codex 的auth.json记住三件套必须齐全Base URL Key Model ID。少任何一个都会报错。CC Switch 里切换配置后要重启对应工具Cline MCP 的配置写在 MCP 服务器定义里路径要对Codex 的auth.json放在~/.codex/下字段名别写错。三者共同的坑是改了配置不重启工具读的还是旧值。6. 把策略、路径、密钥三件事一次理顺回到最开始那个让人困惑的现象CMD 正常、PowerShell 报错。现在你应该清楚了这不是权限问题不是 Node.js 装错而是 PowerShell 执行策略在.ps1这一层拦了一道。解决它只需要一条Set-ExecutionPolicy RemoteSigned -Scope CurrentUser重启终端即可。但策略通了只是让 Claude Code 能启动真正跑起来还得靠配置三件套Base URL、Key、Model ID。这两件事经常被混在一起导致有人改了策略还是用不了就以为是策略没生效其实是密钥没配。分开排查效率会高很多。给你一个实用习惯每次在新机器上装完 Node.js CLI 工具先跑一遍Get-ExecutionPolicy -List看到LocalMachine是Restricted就顺手把CurrentUser设成RemoteSigned。这样以后装任何 npm 全局工具都不会再被这个报错绊住。密钥方面把配置片段存成模板换机器时改一下 Key 就能用省得每次翻文档。如果你还没生成密钥去 https://taotoken.net/api-keys 建一个配置字段不确定就查 https://taotoken.net/doc想先验证密钥能不能用直接去 https://taotoken.net/models 发条消息试试。长期用 Claude Code 做编码或跑 Agent 的话Coding Plan 会比按量更划算具体在 https://taotoken.net/coding-plan 看。策略、路径、密钥这三件事一次理顺后面就都是顺水推舟了。