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

时间:2019-03-19 09:22:39

标签: npm cmd package.json npm-scripts

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

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

输出:"qwerty"

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

package.json:

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

> npm run qwerty

输出为:%A%

我是在做错什么还是在NPM运行时不应该那样做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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中创建,而在第二个中可以找到。