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

问题描述 投票:0回答:2

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

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

输出:"qwerty"

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

的package.json:

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

> npm run qwerty

输出是:%A%

我做错了什么,或者在NPM运行时不应该这样做?

npm cmd package.json npm-scripts
2个回答
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命令的组合(注意批处理文件%中加倍的CALL Echo %%_var%%百分号):

@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

0
投票

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

"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中创建,并且可以在第二个中找到。

© www.soinside.com 2019 - 2024. All rights reserved.