当你兴高采烈地在 Windows PowerShell 中敲下 npm install,却看到一行红色报错:

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

别慌,这不是 Node.js 装坏了,而是 Windows 在保护你。

1
2
3
4
5
6
7
8
9
10
11
12
13
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\Administrator> npm
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof
t.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ npm
+ ~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess

为什么会发生这个错误?

Windows PowerShell 默认的执行策略(Execution Policy)是 Restricted,即禁止运行任何脚本文件。

当你输入 npm 时,PowerShell 会优先查找并执行 npm.ps1(一个 PowerShell 脚本),而不是我们熟悉的 npm.cmd 可执行文件。由于策略限制,系统拒绝运行该脚本,于是抛出 PSSecurityException

这个机制主要是为了防止恶意脚本意外执行。好消息是——解决起来非常简单。

解决方案(任选一种即可)

方案一:改用命令提示符(CMD)—— 最省事

既然只有 PowerShell 会管脚本策略,那直接换到 命令提示符 就好了。

  • Win + R,输入 cmd,回车。
  • 在打开的 CMD 窗口中正常使用 npm 命令(例如 npm install)。

CMD 不会执行 .ps1 脚本,所以永远不会触发这个错误。如果你不常用 PowerShell 的高级功能,这个方案零成本、零风险。

方案二:在 PowerShell 中强制使用 npm.cmd

PowerShell 其实也可以直接调用 npm.cmd,避免去查找 npm.ps1

1
npm.cmd install

如果你觉得每次都多打一个 .cmd 很麻烦,可以为它设置一个别名:

1
Set-Alias -Name npm -Value npm.cmd

把这个命令写入 PowerShell 的配置文件($PROFILE),以后每次打开 PowerShell 都会自动生效。

方案三:修改 PowerShell 执行策略(一劳永逸)

这是最根本的解决办法——调整执行策略,允许运行本地或已签名的脚本。

推荐做法(仅影响当前用户,无需管理员权限):

1
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  • RemoteSigned:本地编写的脚本可以直接运行,从网络下载的脚本必须经过数字签名。这是安全性与便利性的最佳平衡。
  • -Scope CurrentUser:只修改当前用户的策略,不会影响系统其他账户,也不需要以管理员身份运行 PowerShell。

执行后系统会询问是否确认更改,输入 Y 并回车即可。
完成后关闭并重新打开 PowerShell,再试 npm,问题就消失了。

如果上述命令提示需要管理员权限(某些旧版本 Windows 或特定环境),请右键“Windows PowerShell”选择“以管理员身份运行”,然后执行:

1
Set-ExecutionPolicy RemoteSigned

输入 Y 确认,重启 PowerShell 即可。

方案四:临时绕过(仅当前会话有效)

如果你不想永久修改策略,只想在当前这个 PowerShell 窗口里临时跑一下 npm

1
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

这条命令只在当前进程(窗口)中生效,关闭窗口后策略自动恢复原状。适合一次性使用或测试环境。

补充知识:PowerShell 执行策略是什么?

执行策略不是安全边界,而是“防呆机制”。它主要防止用户无意中运行恶意脚本。常见级别:

策略 说明
Restricted 默认值,禁止任何脚本运行
RemoteSigned 本地脚本可运行,远程脚本需签名
AllSigned 所有脚本(包括本地)都需签名
Unrestricted 所有脚本都可运行(不推荐)
Bypass 什么也不阻止,基本无限制

对于我们日常使用 Node.js、Python 等开发工具,RemoteSigned 是最合适的。

总结

方案 优点 适用场景
改用 CMD 无需任何配置,100% 有效 习惯使用 CMD 的用户
使用 npm.cmd 不修改系统策略 偶尔使用 PowerShell 但不希望改动
修改执行策略 彻底解决,一劳永逸 日常主力使用 PowerShell 的开发者
临时绕过 不改变任何设置 临时救急,或测试环境

我个人最推荐 方案三(修改为 RemoteSigned + CurrentUser),既安全又方便,一次配置永久受益。