Как использовать переменные "set" для консоли Windows в сценариях NPM?
Это работает в консоли Windows, как и ожидалось:
set A="qwerty" && echo %A%
выход: "qwerty"
Но когда я пытаюсь выполнить те же команды в скиптах NPM:
package.json:
"scripts": {
"qwerty": "set A=\"qwerty\" && echo %A%"
}
> npm run qwerty
выход: %A%
Я делаю что-то не так или это просто не должно работать, когда запускается NPM?
2 ответа
Ваш пример set A="qwerty" && echo %A%
не правильно Переменные в cmd
Приглашение / пакетный файл раскрываются один раз для каждой строки / команды:
==> set "A="
==> echo %A%
%A%
==> set A="qwerty" && echo %A%
%A%
==> echo %A%
"qwerty"
Почему это поведение?
SET
Впервые команда была введена в MS-DOS 2.0 в марте 1983 года, в то время память и процессор были очень ограничены, и было достаточно расширения переменных один раз на строку.
Обходной путь с использованием CALL
команда:
==> 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
и можно найти во втором.