解决 PowerShell 中 npm 命令报错“禁止运行脚本”的几种方法

当你兴高采烈地在 Windows PowerShell 中敲下 npm install,却看到一行红色报错:
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
别慌,这不是 Node.js 装坏了,而是 Windows 在保护你。
1 | Windows PowerShell |
为什么会发生这个错误?
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),既安全又方便,一次配置永久受益。


