这可以按预期在Windows控制台中工作:
set A="qwerty" && echo %A%
输出:"qwerty"
但是当我尝试在NPM脚本中运行相同的命令时:
package.json:
"scripts": {
"qwerty": "set A=\"qwerty\" && echo %A%"
}
> npm run qwerty
输出为:%A%
我是在做错什么还是在NPM运行时不应该那样做?
答案 0 :(得分:1)
您的示例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
答案 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
中创建,而在第二个中可以找到。