Как использовать переменные "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 и можно найти во втором.

Другие вопросы по тегам