You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NPM脚本中使用Windows控制台set变量?为何变量输出失效?

为什么NPM脚本里的Windows环境变量输出不对?

这不是你操作错了,而是NPM在Windows下处理命令的机制搞的鬼,我给你掰扯清楚:

问题根源

当你在Windows控制台直接执行set A="qwerty" && echo %A%时,整个命令是在同一个cmd shell进程里执行的:

  • 先执行set A="qwerty"给变量完成赋值
  • 紧接着echo %A%时,cmd会在当前进程里找到刚赋值的A变量,自然能正常输出内容

但NPM脚本执行时,会启动一个新的cmd子进程来运行你的命令,而且NPM会先对脚本内容做一层预处理——它会把%A%里的百分号当作特殊字符处理,导致在变量赋值之前,%A%就被解析成空或者原样保留,最终输出%A%。

解决方法

方法1:转义百分号

把脚本里的%换成%%,这样NPM传递给cmd的时候,会还原成单个%,cmd就能正确解析赋值后的变量了:

"scripts": {
  "qwerty": "set A=\"qwerty\" && echo %%A%%"
}

方法2:启用CMD延迟扩展

开启cmd的延迟扩展功能,用!变量名!的方式引用变量,这样变量会在命令执行时才被解析,避开NPM的提前预处理:

"scripts": {
  "qwerty": "cmd /v:on /c \"set A=qwerty && echo !A!\""
}

这里的/v:on是开启延迟扩展,/c是告诉cmd执行完后面的命令后退出,整个命令要用引号括起来保证是一个整体。

跨平台小提示

如果你的项目需要跨Windows和类Unix系统运行,推荐用cross-env工具统一设置环境变量,避免不同系统的语法差异,比如:

"scripts": {
  "qwerty": "cross-env A=qwerty echo %A%"
}

(Windows下依然可以用%A%,类Unix下会自动转换成$A)

内容的提问来源于stack exchange,提问作者Serg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:33:08