这在Windows控制台中按预期方式工作:
set A="qwerty" && echo %A%
输出:"qwerty"
但是当我尝试在NPM脚本中运行相同的命令时:
的package.json:
"scripts": {
"qwerty": "set A=\"qwerty\" && echo %A%"
}
> npm run qwerty
输出是:%A%
我做错了什么,或者在NPM运行时不应该这样做?
您的示例set A="qwerty" && echo %A%
不正确。 cmd
提示符/批处理文件中的变量每行/命令扩展一次:
==> set "A="
==> echo %A%
%A%
==> set A="qwerty" && echo %A%
%A%
==> echo %A%
"qwerty"
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
到目前为止,我发现这些命令为了正常工作必须在不同的脚本中并按特定顺序运行。所以,这是它的工作方式:
"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
中创建,并且可以在第二个中找到。