如何在 NPM 脚本中使用 Windows 控制台“设置”变量?

Posted

技术标签:

【中文标题】如何在 NPM 脚本中使用 Windows 控制台“设置”变量?【英文标题】:How to use Windows console 'set' variables with NPM scripts? 【发布时间】:2019-08-09 18:27:20 【问题描述】:

这在 Windows 控制台中按预期工作:

set A="qwerty" && echo %A%

输出:"qwerty"

但是当我尝试在 NPM scipts 中运行相同的命令时:

package.json:

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

> npm run qwerty

输出为:%A%

我做错了什么,或者它在 NPM 运行时不应该以这种方式工作?

【问题讨论】:

好吧,你的第一个命令行实际上不起作用;做set "A=",然后再试一次,你会得到%A%的回声。要在同一行或代码块中编写读取变量,您需要delayed expansion,因此在使用cmd /V:ON 启动命令提示符时需要set "A=qwerty" & echo(!A!。或者,尝试set "A=qwerty" & call echo(%^A%(尽管在某些情况下这可能仍然失败)... 是的,我猜我的第一个命令似乎正在运行,因为我猜是之前的运行。 没错,就是这个原因…… 【参考方案1】:

您的示例 set A="qwerty" && echo %A% 不正确。 cmd 提示符/批处理文件中的变量每行/命令展开一次:

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && echo %A%
%A%

==> echo %A%
"qwerty"

Why this behaviour?

SET 命令于 1983 年 3 月首次引入 MS-DOS 2.0, 当时内存和 CPU 非常有限, 每行一个变量就足够了

使用CALL command 的解决方法:

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && CALL echo %A%
"qwerty"

编辑:

为了完整起见,下面的批处理脚本显示了百分比扩展的机制及其与CALL命令的结合详细(注意在批处理文件中加倍%百分号@ 987654331@):

@ECHO OFF
SETLOCAL
if NOT "%~1"=="" ECHO ON
echo        1st:
Set "_var=first"
Set "_var=second" & Echo %_var% & CALL Echo %%_var%%  
echo        2nd: 
Set "_var=first"
Set "_var=second" & CALL Echo %%_var%% & Echo %_var%  

输出,echo OFF:

==> D:\bat\SO\55237418.bat
       1st:
first
second
       2nd:
second
first

输出,echo ON:

==> D:\bat\SO\55237418.bat on

==> echo        1st:
       1st:

==> Set "_var=first"

==> Set "_var=second"   & Echo first   & CALL Echo %_var%
first
second

==> echo        2nd:
       2nd:

==> Set "_var=first"

==> Set "_var=second"   & CALL Echo %_var%   & Echo first
second
first

【讨论】:

我猜 set A="qwerty" && echo %A% 似乎在我的控制台中工作,因为之前的运行实际上没有工作,但我没有注意到,只看到它在下一次运行中工作。跨度> 【参考方案2】:

到目前为止,我发现这些命令为了正常工作,必须在不同的脚本中并以特定的顺序运行。所以,这是它的工作方式:

"scripts": 
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"

npm run aaa

输出: test

但是这个不行:

"scripts": 
  "aaa": "set TMP=test",
  "bbb": "npm run aaa && echo %TMP%"

npm run bbb

输出:<just empty>

看起来需要两个单独的npm run 命令才能找到创建的变量:该变量应该在第一个npm run 中创建,并且可以在第二个中找到。

【讨论】:

以上是关于如何在 NPM 脚本中使用 Windows 控制台“设置”变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 上安装 nodemon?

在 Windows 上使用 npm install 时,Jenkins 脚本过早退出

使用ANTD前端开发——开发环境搭建(Windows)

如何在 npm 脚本中使用 nodemon 来构建和启动脚本?

如何在 npm 脚本中使用 .env 变量

如何在 npm 脚本中获取包版本和日期?