如何在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
相关产品推荐
相关产品推荐

