解决 PowerShell 执行策略问题:为什么 npm 无法运行,CMD 和 PowerShell 到底有什么区别?
一、前言:
做微信小程序开发时,在装环境时就因为常识不够遇到几个问题:
✅ 第一个坑:Node.js装在C盘、小程序项目放在E盘,在微信开发者工具的PowerShell终端运行npm install,直接报错,提示无法运行npm脚本,压根用不了npm;
当时我第一反应是:Node在C盘、项目在E盘,当时运行终端是E盘程序目录下,而npm(npm(“Node 包管理器”)是 JavaScript 运行时 Node.js 的默认程序包管理器,存在nodejs中)在C盘,所以是因为找不到npm才报错?

小程序开发者工具的power shell
但核心原因根本不是因为不可跨盘找,而是PowerShell禁止运行npm脚本,所以最简单的解决办法就是直接把终端换成CMD,但是又遇到其它问题了。。。
✅ 第二个坑:在CMD终端执行npm install,以为能顺利装依赖了,结果又提示找不到package.json,还是没法正常执行npm install。

系统终端cmd
我在遇到问题的时候直接截图丢给AI,发现AI只会给几种解决方法让你去试,原因原理啥的都不讲。现在梳理下具体原因并记录分享。
二、两大核心问题及分步解决
2.1 第一个问题:PowerShell终端无法运行npm
2.1.1 破除误区:报错和C盘、E盘跨盘符无关
先明确核心结论:这个报错绝对不是因为Node.js在C盘、项目在E盘,也不是系统找不到npm程序,完全是PowerShell自身的安全限制导致的,新手极易误解为跨盘符问题,二者实则毫无关联。
2.1.2 系统查找npm的底层逻辑(与项目路径无关)
在终端输入npm install并回车后,第一步是系统先找到npm程序才能执行命令,这一步仅和Node.js安装路径相关,具体逻辑如下:
- 安装Node.js时,默认路径为C:\Program Files\nodejs\,安装程序会自动将该路径添加到系统环境变量PATH中;
- 系统会遍历PATH里的所有文件夹,最终在C:\Program Files\nodejs\目录下找到npm可执行文件并启动程序;
- 这一步只是系统调用工具的过程,和项目存储在哪个盘符、项目文件位置,没有任何关联。

系统power shell
2.1.3 解决方案:
所以最简便的是去CMD执行安装npm的命令。于是在cmd执行命令又遇到问题,提示找不到package.json。于是我又疑问,nodejs文件里有自带的package.json,我的E盘项目里没有,不会是跨盘找不到吧?其实又不是!
2.2 第二个问题:切换CMD后,提示找不到package.json

系统CMD
2.2.1 npm查找项目package.json的规则
npm程序启动后,只识别当前终端所在的E盘项目目录,绝对不会跨盘符查找文件,更不会主动去C盘Node.js目录里查找无关文件。npm查找package.json有固定铁律:
- 从当前终端打开的项目根目录(E盘小程序项目目录)开始查找;
- 若当前目录未找到,向上一级目录逐级查找,直至当前盘符根目录(E盘根目录);
- 到达盘符根目录仍未找到,就会直接停止查找,绝不会跨到C盘搜索,盘符是文件系统的天然边界,npm不会突破该规则。
另外,C盘Node.js目录里自带的package.json,是npm工具自身的配置文件,和小程序项目毫无关联,npm不会读取该文件,完全不用担心C盘文件干扰E盘项目。
2.2.2 两类易混淆的package.json对比
新手极易混淆两个用途完全不同的package.json,具体区别如下:
|
文件类型 |
存储位置 |
核心用途 |
是否影响项目 |
|
Node.js自带package.json |
C:\Program Files\nodejs\node_modules\npm\package.json |
记录npm工具自身版本、依赖、命令入口等信息 |
❌ 完全无关 |
|
项目专属package.json |
E:\WeChatprogram\Smart Community\package.json |
管理项目所需第三方依赖,记录安装包及版本 |
✅ 必须手动创建 |
2.2.3 为什么Node.js会自带package.json?
Node.js本身是一款软件,也有自身依赖和配置需求,C盘自带的package.json是npm工具的自述文件,主要作用是告知系统:
- npm工具的版本号
- npm自身依赖的第三方包
- npm命令的入口位置
这就好比微信安装在C盘有专属配置文件,但和微信内的聊天记录(你的项目文件)完全无关,核心逻辑:工具自身配置≠项目配置,二者一定要区分开!
2.2.4 正确做法:在E盘项目内创建专属package.json
每个项目都需要专属的package.json,记录自身依赖信息,示例内容如下:
|
|
必须在项目目录创建该文件,原因有三点:
- 项目独立性:每个项目可配置专属依赖,互不干扰
- 可移植性:项目拷贝到其他电脑,依赖配置可同步跟随
- 版本管理:不同项目可使用同一依赖包的不同版本
总结:C盘的package.json是npm工具的自有配置,和项目完全无关;你的小程序项目,必须在E盘根目录创建专属的package.json,这是管理项目依赖的唯一正确方式。
2.2.5 完整实操解决步骤
第一步:确认终端处于项目根目录
打开微信开发者工具,先核对底部终端路径,必须精准定位到E盘小程序项目根目录,既不能是C盘Node.js目录,也不能是项目子文件夹,这是最核心的前提。
第二步:生成项目专属package.json
在项目根目录执行命令,仅在E盘生成专属配置文件,和C盘无任何关联:
|
cmd |
执行后终端会提示:Wrote to E:\xxx\小程序项目\package.json,证明文件生成路径正确。

第三步:执行npm install安装依赖
生成配置文件后,直接执行npm install命令,依赖包会自动安装到项目根目录的node_modules文件夹,全程仅在E盘运行,不会触碰C盘任何文件。

第四步:安装项目实际所需依赖包
npm环境配置完成后,即可安装小程序所需的第三方依赖,比如常用的Vant组件库:
|
cmd |

最后在小程序构建npm,成功。


三、有没有想过, 为什么同样的命令PowerShell报错,CMD却完全正常?
这就要说到Node.js安装后的两个关键文件,以及两个终端的调用逻辑差异:
- Node.js自带两套npm启动文件:C:\Program Files\nodejs\目录下,同时有npm.cmd(CMD专用批处理文件)和npm.ps1(PowerShell专用脚本文件);
- CMD的运行逻辑:CMD是老式命令行,只识别.cmd后缀的文件,直接调用npm.cmd运行,完全不碰.ps1脚本,没有任何权限限制,所以能正常执行;
- PowerShell的运行逻辑:PowerShell是现代化脚本环境,优先调用.ps1后缀的脚本文件,而Windows默认给PowerShell设置了Restricted(严格限制)执行策略,禁止运行任何本地.ps1脚本,直接把npm.ps1拦住了,所以报错。
简单说:PowerShell管得严,不让脚本随便跑;CMD管得松,直接运行批处理文件,这就是同一个命令、两个终端结果完全不同的核心原因。
那很多人都会纠结:PowerShell是微软新出的命令行,功能比CMD强太多,为什么遇到npm报错,所有人都让我换成CMD?二者到底有什么核心区别,对我们小程序开发来说该怎么选?
3.1 CMD与PowerShell核心差异
|
对比维度 |
CMD(命令提示符) |
PowerShell |
|
对npm的兼容性 |
完美兼容,直接调用npm.cmd,无任何权限阻碍,零配置可用 |
默认不兼容,调用npm.ps1被安全策略拦截,需要手动改系统设置 |
|
安全策略 |
几乎无脚本限制,安全性低,但对前端开发足够用 |
严格执行策略,防止恶意脚本,权限管控极严 |
|
上手难度 |
零门槛,不用改任何系统设置,切换就能用 |
需要管理员权限修改执行策略,新手容易改出问题 |
|
适配场景 |
专门适配小程序/前端npm安装、简单命令操作,轻量化无负担 |
适合系统运维、复杂自动化脚本,日常开发完全没必要 |
|
操作成本 |
微信开发者工具一键切换,10秒搞定,零风险 |
需要管理员运行、输命令改策略、重启终端,步骤繁琐有风险 |
3.2 为什么优先推荐CMD
- 零配置、零报错:不用动系统任何设置,不用管PowerShell的执行策略,微信开发者工具里切换终端,立刻就能运行npm install,完全避开报错;
- 完全适配小程序开发:我们做小程序,只用npm装依赖、执行简单命令,CMD的功能完全够用,PowerShell的高级功能根本用不上;
- 零风险:修改PowerShell执行策略需要管理员权限,新手如果改得太宽松,会留下安全隐患,而CMD完全没有这个顾虑;
- 不影响项目路径:不管项目在E盘、D盘,CMD都能正常识别,不会出现跨盘符问题,和PowerShell的报错问题彻底切割。
四、两种解决方案
4.1 新手首选:一键切换CMD
- 打开微信开发者工具,找到底部终端面板;
- 点击终端右上角的下拉菜单,选择命令提示符(CMD);
- 重启终端,确认路径在E盘项目根目录,直接执行npm命令即可。
优势:不用改系统设置、不用管理员权限、不会留安全隐患,适合所有小程序开发者,一劳永逸避开PowerShell报错。

若未找到cmd,则点击“选择默认shell”,再选择command prompt即可。

4.2 进阶方案:修改PowerShell执行策略(长期用PowerShell选这个)
1、Windows开始菜单搜索PowerShell,右键以管理员身份运行;
2、输入命令,修改当前用户的执行策略:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
3、弹出提示后输入Y确认,关闭所有PowerShell终端,重新打开即可正常运行npm。
|
注意:RemoteSigned是兼顾安全的策略,只允许本地脚本运行,不要改成Unrestricted,避免安全风险。 |
五、全文总结
- 路径误区澄清:C盘装Node.js、E盘放项目完全没问题,npm不会跨盘符找文件,报错和存储位置无关;
- 报错真正原因:PowerShell默认执行策略禁止npm.ps1脚本运行,CMD调用npm.cmd无限制,所以能正常运行;
- 终端选择建议:小程序开发优先用CMD,零配置零报错,不用折腾PowerShell;
- npm正确操作:终端切到项目根目录,先npm init -y生成配置,再执行install,全程只在项目盘符内运行。
以后再遇到PowerShell npm报错,不用再怀疑Node.js安装路径、不用乱改环境变量,直接切换CMD就能解决,再也不用踩这些新手坑!
(注:文档部分内容大部分由 AI 生成)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)